ALTER INDEX(Transact-SQL)ALTER INDEX (Transact-SQL)

적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) 예Azure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database 예Azure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance 예Azure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics 예병렬 데이터 웨어하우스Parallel Data Warehouseyes병렬 데이터 웨어하우스Parallel Data Warehouse적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) 예Azure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database 예Azure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance 예Azure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics 예병렬 데이터 웨어하우스Parallel Data Warehouseyes병렬 데이터 웨어하우스Parallel Data Warehouse

인덱스를 사용하지 않도록 설정, 다시 빌드 또는 다시 구성하거나 인덱스에 대한 옵션을 설정하여 기존 테이블 또는 뷰 인덱스(rowstore, columnstore, 또는 XML)를 수정합니다.Modifies an existing table or view index (rowstore, columnstore, or XML) by disabling, rebuilding, or reorganizing the index; or by setting options on the index.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

-- Syntax for SQL Server and Azure SQL Database
  
ALTER INDEX { index_name | ALL } ON <object>  
{  
      REBUILD {  
            [ PARTITION = ALL ] [ WITH ( <rebuild_index_option> [ ,...n ] ) ]   
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> ) [ ,...n ] ]  
      }  
    | DISABLE  
    | REORGANIZE  [ PARTITION = partition_number ] [ WITH ( <reorganize_option>  ) ]  
    | SET ( <set_index_option> [ ,...n ] )   
    | RESUME [WITH (<resumable_index_options>,[...n])]
    | PAUSE
    | ABORT
}  
[ ; ]  
  
<object> ::=   
{  
    { database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }  
}  
  
<rebuild_index_option > ::=  
{  
      PAD_INDEX = { ON | OFF }  
    | FILLFACTOR = fillfactor   
    | SORT_IN_TEMPDB = { ON | OFF }  
    | IGNORE_DUP_KEY = { ON | OFF }  
    | STATISTICS_NORECOMPUTE = { ON | OFF }  
    | STATISTICS_INCREMENTAL = { ON | OFF }  
    | ONLINE = {   
          ON [ ( <low_priority_lock_wait> ) ]   
        | OFF } 
    | RESUMABLE = { ON | OFF } 
    | MAX_DURATION = <time> [MINUTES}     
    | ALLOW_ROW_LOCKS = { ON | OFF }  
    | ALLOW_PAGE_LOCKS = { ON | OFF }  
    | MAXDOP = max_degree_of_parallelism  
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }   
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]  
}  
  
<single_partition_rebuild_index_option> ::=  
{  
      SORT_IN_TEMPDB = { ON | OFF }  
    | MAXDOP = max_degree_of_parallelism  
    | RESUMABLE = { ON | OFF } 
    | MAX_DURATION = <time> [MINUTES}     
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE } }  
    | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }  
}  
  
<reorganize_option>::=  
{  
       LOB_COMPACTION = { ON | OFF }  
    |  COMPRESS_ALL_ROW_GROUPS =  { ON | OFF}  
}  
  
<set_index_option>::=  
{  
      ALLOW_ROW_LOCKS = { ON | OFF }  
    | ALLOW_PAGE_LOCKS = { ON | OFF }  
    | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
    | IGNORE_DUP_KEY = { ON | OFF }  
    | STATISTICS_NORECOMPUTE = { ON | OFF }  
    | COMPRESSION_DELAY= { 0 | delay [Minutes] }  
}  

<resumable_index_option> ::=
 { 
    MAXDOP = max_degree_of_parallelism
    | MAX_DURATION =<time> [MINUTES]
    | <low_priority_lock_wait>  
 }
 
<low_priority_lock_wait>::=  
{  
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,   
                          ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )  
}  

-- Syntax for SQL Data Warehouse and Parallel Data Warehouse 
  
ALTER INDEX { index_name | ALL }  
    ON   [ schema_name. ] table_name  
{  
      REBUILD {  
            [ PARTITION = ALL [ WITH ( <rebuild_index_option> ) ] ] 
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> )] ] 
      }  
    | DISABLE  
    | REORGANIZE [ PARTITION = partition_number ]  
}  
[;]  

<rebuild_index_option > ::=   
{  
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]   
}

<single_partition_rebuild_index_option > ::=   
{  
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }  
}  
  

참고

SQL Server 2014 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

인수Arguments

index_nameindex_name
인덱스의 이름입니다.Is the name of the index. 인덱스 이름은 테이블이나 뷰에서 고유해야 하지만 데이터베이스 내에서 고유할 필요는 없습니다.Index names must be unique within a table or view but do not have to be unique within a database. 인덱스 이름은 식별자 규칙을 따라야 합니다.Index names must follow the rules of identifiers.

ALLALL
인덱스 유형에 관계없이 테이블이나 뷰에 연결된 모든 인덱스를 지정합니다.Specifies all indexes associated with the table or view regardless of the index type. ALL을 지정하면 하나 이상의 인덱스가 오프라인 또는 읽기 전용 파일 그룹에 있거나 지정한 작업이 하나 이상의 인덱스 유형에 대해 허용되지 않을 경우 해당 문이 실패합니다.Specifying ALL causes the statement to fail if one or more indexes are in an offline or read-only filegroup or the specified operation is not allowed on one or more index types. 다음 표에서는 인덱스 작업과 허용되지 않는 인덱스 유형을 나열합니다.The following table lists the index operations and disallowed index types.

이 작업에 키워드 ALL 사용Using the keyword ALL with this operation 테이블에 다음 인덱스가 하나 이상 있으면 실패함Fails if the table has one or more
REBUILD WITH ONLINE = ONREBUILD WITH ONLINE = ON XML 인덱스XML index

공간 인덱스Spatial index

Columnstore 인덱스: 적용 대상: SQL ServerSQL Server (SQL Server 2012(11.x)SQL Server 2012 (11.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseColumnstore index: Applies to: SQL ServerSQL Server (Starting with SQL Server 2012(11.x)SQL Server 2012 (11.x)) and Azure SQL DatabaseAzure SQL Database
REBUILD PARTITION = partition_numberREBUILD PARTITION = partition_number 분할되지 않은 인덱스, XML 인덱스, 공간 인덱스 또는 비활성 인덱스Nonpartitioned index, XML index, spatial index, or disabled index
REORGANIZEREORGANIZE ALLOW_PAGE_LOCKS가 OFF로 설정된 인덱스Indexes with ALLOW_PAGE_LOCKS set to OFF
REORGANIZE PARTITION = partition_numberREORGANIZE PARTITION = partition_number 분할되지 않은 인덱스, XML 인덱스, 공간 인덱스 또는 비활성 인덱스Nonpartitioned index, XML index, spatial index, or disabled index
IGNORE_DUP_KEY = ONIGNORE_DUP_KEY = ON XML 인덱스XML index

공간 인덱스Spatial index

Columnstore 인덱스: 적용 대상: SQL ServerSQL Server (SQL Server 2012(11.x)SQL Server 2012 (11.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseColumnstore index: Applies to: SQL ServerSQL Server (Starting with SQL Server 2012(11.x)SQL Server 2012 (11.x)) and Azure SQL DatabaseAzure SQL Database
ONLINE = ONONLINE = ON XML 인덱스XML index

공간 인덱스Spatial index

Columnstore 인덱스: 적용 대상: SQL ServerSQL Server (SQL Server 2012(11.x)SQL Server 2012 (11.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseColumnstore index: Applies to: SQL ServerSQL Server (Starting with SQL Server 2012(11.x)SQL Server 2012 (11.x)) and Azure SQL DatabaseAzure SQL Database
RESUMABLE = ONRESUMABLE = ON 다시 시작할 수 있는 인덱스는 All 키워드에 대해 지원되지 않습니다.Resumable indexes not supported with All keyword.

적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x)) and Azure SQL DatabaseAzure SQL Database

경고

온라인으로 수행할 수 있는 인덱스 작업에 대한 자세한 내용은 온라인 인덱스 작업 지침을 참조하세요.For more detailed information about index operations that can be performed online, see Guidelines for Online Index Operations.

ALL을 PARTITION = partition_number와 함께 지정하면 모든 인덱스가 정렬되어야 합니다.If ALL is specified with PARTITION = partition_number, all indexes must be aligned. 즉, 해당 파티션 함수를 기준으로 인덱스가 분할됩니다.This means that they are partitioned based on equivalent partition functions. PARTITION 절에 ALL을 사용하면 같은 partition_number를 가진 모든 인덱스 파티션이 다시 작성되거나 다시 구성됩니다.Using ALL with PARTITION causes all index partitions with the same partition_number to be rebuilt or reorganized. 분할된 인덱스에 대한 자세한 내용은 Partitioned Tables and Indexes를 참조하세요.For more information about partitioned indexes, see Partitioned Tables and Indexes.

database_namedatabase_name
데이터베이스의 이름입니다.Is the name of the database.

schema_nameschema_name
테이블이나 뷰가 속한 스키마의 이름입니다.Is the name of the schema to which the table or view belongs.

table_or_view_nametable_or_view_name
인덱스와 관련된 테이블이나 뷰의 이름입니다.Is the name of the table or view associated with the index. 개체에 대한 인덱스 보고서를 표시하려면 sys.indexes 카탈로그 뷰를 사용합니다.To display a report of the indexes on an object, use the sys.indexes catalog view.

database_name이 현재 데이터베이스이거나 database_name이 tempdb이고 table_or_view_name이 #로 시작하는 경우 SQL DatabaseSQL Database은 세 부분으로 구성된 이름 형식 database_name.[schema_name].table_or_view_name을 지원합니다.SQL DatabaseSQL Database supports the three-part name format database_name.[schema_name].table_or_view_name when the database_name is the current database or the database_name is tempdb and the table_or_view_name starts with #.

REBUILD [ WITH ( <rebuild_index_option> [ , ... n] ) ]REBUILD [ WITH (<rebuild_index_option> [ ,... n]) ]

적용 대상: SQL ServerSQL Server (SQL Server 2012(11.x)SQL Server 2012 (11.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2012(11.x)SQL Server 2012 (11.x)) and Azure SQL DatabaseAzure SQL Database

동일한 열, 인덱스 유형, 고유성 특성 및 정렬 순서를 사용하여 인덱스가 다시 작성되도록 지정합니다.Specifies the index will be rebuilt using the same columns, index type, uniqueness attribute, and sort order. 이 절은 DBCC DBREINDEX와 동일합니다.This clause is equivalent to DBCC DBREINDEX. REBUILD는 비활성 인덱스를 활성화합니다.REBUILD enables a disabled index. ALL 키워드를 지정하지 않으면 클러스터형 인덱스를 다시 작성해도 관련 비클러스터형 인덱스는 다시 작성되지 않습니다.Rebuilding a clustered index does not rebuild associated nonclustered indexes unless the keyword ALL is specified. 인덱스 옵션을 지정하지 않으면 sys.indexes에 저장된 기존 인덱스 옵션 값이 적용됩니다.If index options are not specified, the existing index option values stored in sys.indexes are applied. sys.indexes에 값이 저장되지 않은 인덱스 옵션의 경우에는 옵션의 인수 정의에 표시된 기본값이 적용됩니다.For any index option whose value is not stored in sys.indexes, the default indicated in the argument definition of the option applies.

ALL을 지정한 경우 기본 테이블이 힙이면 다시 작성 작업을 수행해도 테이블에는 아무 영향이 없습니다.If ALL is specified and the underlying table is a heap, the rebuild operation has no effect on the table. 테이블에 연결된 비클러스터형 인덱스는 모두 다시 작성됩니다.Any nonclustered indexes associated with the table are rebuilt.

데이터베이스 복구 모델이 대량 로그 또는 단순으로 설정되어 있으면 다시 작성 작업이 최소한으로 기록될 수 있습니다.The rebuild operation can be minimally logged if the database recovery model is set to either bulk-logged or simple.

참고

기본 XML 인덱스를 다시 작성할 때는 인덱스 작업 중에 기본 사용자 테이블을 사용할 수 없습니다.When you rebuild a primary XML index, the underlying user table is unavailable for the duration of the index operation.

columnstore 인덱스의 다시 작성 작업은:For columnstore indexes, the rebuild operation:

  • 정렬 순서를 사용하지 않습니다.Does not use the sort order.
  • 다시 작성 작업이 발생한 동안 테이블 또는 파티션에서 배타적 잠금을 획득합니다.Acquires an exclusive lock on the table or partition while the rebuild occurs. NOLOCK, RCSI 또는 SI를 사용하는 경우에도 다시 작성 중에 데이터는 “오프라인”이며 사용할 수 없습니다.The data is "offline" and unavailable during the rebuild, even when using NOLOCK, RCSI, or SI.
  • 모든 데이터를 columnstore로 다시 압축합니다.Re-compresses all data into the columnstore. 다시 작성 작업이 발생한 동안에는 columnstore 인덱스의 두 복사본이 존재합니다.Two copies of the columnstore index exist while the rebuild is taking place. 다시 작성 작업이 끝나면 SQL ServerSQL Server 에서 원래 columnstore 인덱스를 삭제합니다.When the rebuild is finished, SQL ServerSQL Server deletes the original columnstore index.

자세한 내용은 인덱스 다시 구성 및 다시 작성을 참조하세요.For more information, see Reorganize and Rebuild Indexes.

PARTITIONPARTITION

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

인덱스의 한 파티션만 다시 작성하거나 다시 구성하도록 지정합니다.Specifies that only one partition of an index will be rebuilt or reorganized. index_name이 분할된 인덱스가 아니면 PARTITION을 지정할 수 없습니다.PARTITION cannot be specified if index_name is not a partitioned index.

PARTITION = ALL은 모든 파티션을 다시 작성합니다.PARTITION = ALL rebuilds all partitions.

경고

파티션 수가 1,000개를 초과하는 테이블에서 정렬되지 않은 인덱스를 만들거나 다시 작성할 수 있지만 해당 인덱스는 지원되지 않습니다.Creating and rebuilding nonaligned indexes on a table with more than 1,000 partitions is possible, but is not supported. 그러면 작업 중에 성능이 저하되거나 메모리가 과도하게 소비될 수 있습니다.Doing so may cause degraded performance or excessive memory consumption during these operations. Microsoft는 파티션 수가 1,000개를 초과하는 경우에는 정렬된 인덱스만 사용하는 것을 권장합니다.Microsoft recommends using only aligned indexes when the number of partitions exceed 1,000.

partition_numberpartition_number

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

다시 작성하거나 다시 구성할 분할된 인덱스의 파티션 번호입니다.Is the partition number of a partitioned index that is to be rebuilt or reorganized. partition_number는 변수를 참조할 수 있는 상수 식입니다.partition_number is a constant expression that can reference variables. 여기에는 사용자 정의 형식 변수 또는 함수와 사용자 정의 함수가 포함될 수 있지만 Transact-SQLTransact-SQL 문은 참조할 수 없습니다.These include user-defined type variables or functions and user-defined functions, but cannot reference a Transact-SQLTransact-SQL statement. partition_number를 지정하지 않으면 해당 문이 실패합니다.partition_number must exist or the statement fails.

WITH ( <single_partition_rebuild_index_option> )WITH (<single_partition_rebuild_index_option>)

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

SORT_IN_TEMPDB, MAXDOPDATA_COMPRESSION은 단일 파티션(PARTITION = partition_number)을 다시 빌드할 때 지정할 수 있는 옵션입니다.SORT_IN_TEMPDB, MAXDOP, and DATA_COMPRESSION are the options that can be specified when you rebuild a single partition (PARTITION = partition_number). 단일 파티션 다시 작성 작업에는 XML 인덱스를 지정할 수 없습니다.XML indexes cannot be specified in a single partition rebuild operation.

DISABLEDISABLE
인덱스를 비활성 및 데이터베이스 엔진Database Engine에서 사용할 수 없음으로 표시합니다.Marks the index as disabled and unavailable for use by the 데이터베이스 엔진Database Engine. 모든 인덱스를 비활성화할 수 있습니다.Any index can be disabled. 비활성 인덱스의 인덱스 정의는 기본 인덱스 데이터 없이 시스템 카탈로그에 유지됩니다.The index definition of a disabled index remains in the system catalog with no underlying index data. 클러스터형 인덱스를 비활성화하면 사용자가 기본 테이블 데이터에 액세스하지 못합니다.Disabling a clustered index prevents user access to the underlying table data. 인덱스를 활성화하려면 ALTER INDEX REBUILD 또는 CREATE INDEX WITH DROP_EXISTING을 사용합니다.To enable an index, use ALTER INDEX REBUILD or CREATE INDEX WITH DROP_EXISTING. 자세한 내용은 인덱스 및 제약 조건 비활성화인덱스 및 제약 조건 활성화를 참조하세요.For more information, see Disable Indexes and Constraints and Enable Indexes and Constraints.

rowstore 인덱스 REORGANIZEREORGANIZE a rowstore index
rowstore 인덱스의 경우 REORGANIZE는 인덱스 리프 수준을 재구성하도록 지정합니다.For rowstore indexes, REORGANIZE specifies to reorganize the index leaf level. REORGANIZE 작업은:The REORGANIZE operation is:

  • 항상 온라인으로 수행됩니다.Always performed online. 즉, 장기간 차단 테이블 잠금이 유지되지 않으며 ALTER INDEX REORGANIZE 트랜잭션 중 기본 테이블에 대한 쿼리나 업데이트를 계속할 수 있습니다.This means long-term blocking table locks are not held and queries or updates to the underlying table can continue during the ALTER INDEX REORGANIZE transaction.
  • 비활성화된 인덱스에 대해서는 허용되지 않음Not allowed for a disabled index.
  • ALLOW_PAGE_LOCKS가 OFF로 설정된 경우 허용되지 않음Not allowed when ALLOW_PAGE_LOCKS is set to OFF.
  • 트랜잭션 내에서 수행되는 경우 롤백되지 않고 트랜잭션이 롤백됩니다.Not rolled back when it is performed within a transaction and the transaction is rolled back.

참고

ALTER INDEX REORGANIZE가 명시적 트랜잭션을 사용하는 경우(예: BEGIN TRAN ... COMMIT/ROLLBACK 내부의 ALTER INDEX가), REORGANIZE의 잠금 동작은 기본 암시적 트랜잭션 모드가 되는 대신 보다 제한적이 되어 차단을 유발할 수 있습니다.When ALTER INDEX REORGANIZE uses explicit transactions (for example, ALTER INDEX inside a BEGIN TRAN ... COMMIT/ROLLBACK) instead of the default implicit transaction mode, the locking behavior of REORGANIZE becomes more restrictive, potentially causing blocking. 암시적 트랜잭션에 대한 자세한 내용은 SET IMPLICIT_TRANSACTIONS (Transact-SQL)을 참조하세요.For more information about implicit transactions, see SET IMPLICIT_TRANSACTIONS (Transact-SQL).

자세한 내용은 인덱스 다시 구성 및 다시 작성을 참조하세요.For more information, see Reorganize and Rebuild Indexes.

REORGANIZE WITH ( LOB_COMPACTION = { ON | OFF } )REORGANIZE WITH ( LOB_COMPACTION = { ON | OFF } )
rowstore 인덱스에 적용됩니다.Applies to rowstore indexes.

LOB_COMPACTION = ONLOB_COMPACTION = ON

  • 다음과 같은 큰 개체(LOB) 데이터 형식의 데이터를 포함하는 모든 페이지를 압축하도록 지정합니다: 이미지, 텍스트, ntext, varchar(max), nvarchar(max), varbinary(max) 및 xml.Specifies to compact all pages that contain data of these large object (LOB) data types: image, text, ntext, varchar(max), nvarchar(max), varbinary(max), and xml. 이 데이터를 압축하면 디스크상의 데이터 크기를 줄일 수 있습니다.Compacting this data can reduce the data size on disk.
  • 클러스터형 인덱스의 경우 이렇게 하면 테이블에 포함된 모든 LOB 열이 압축됩니다.For a clustered index, this compacts all LOB columns that are contained in the table.
  • 비클러스터형 인덱스의 경우 이렇게 하면 인덱스에서 키가 아닌(포괄) 열인 LOB 열이 모두 압축됩니다.For a nonclustered index, this compacts all LOB columns that are nonkey (included) columns in the index.
  • REORGANIZE ALL은 모든 인덱스에 대해 LOB_COMPACTION을 수행합니다.REORGANIZE ALL performs LOB_COMPACTION on all indexes. 각 인덱스에 대해 클러스터형 인덱스의 모든 LOB 열, 기본 테이블 또는 비클러스터형 인덱스에 포함된 열이 압축됩니다.For each index, this compacts all LOB columns in the clustered index, underlying table, or included columns in a nonclustered index.

LOB_COMPACTION = OFFLOB_COMPACTION = OFF

  • 큰 개체 데이터가 포함된 페이지가 압축되지 않습니다.Pages that contain large object data are not compacted.
  • OFF를 지정해도 힙에는 아무 영향이 없습니다.OFF has no effect on a heap.

columnstore 인덱스 REORGANIZEREORGANIZE a columnstore index
columnstore 인덱스의 경우 REORGANIZE는 압축된 행 그룹으로 각 CLOSED 델타 행 그룹을 columnstore로 압축합니다.For columnstore indexes, REORGANIZE compresses each CLOSED delta rowgroup into the columnstore as a compressed rowgroup. REORGANIZE 작업은 항상 온라인으로 수행됩니다.The REORGANIZE operation is always performed online. 즉, 장기간 차단 테이블 잠금이 유지되지 않으며 ALTER INDEX REORGANIZE 트랜잭션 중 기본 테이블에 대한 쿼리나 업데이트를 계속할 수 있습니다.This means long-term blocking table locks are not held and queries or updates to the underlying table can continue during the ALTER INDEX REORGANIZE transaction. 자세한 내용은 인덱스 다시 구성 및 다시 작성을 참조하세요.For more information, see Reorganize and Rebuild Indexes.

  • 닫힌(CLOSED) 델타 rowgroup을 압축된 rowgroup으로 이동하는 데에는 REORGANIZE가 필요 없습니다.REORGANIZE is not required in order to move CLOSED delta rowgroups into compressed rowgroups. 배경 TM(튜플 이동기) 프로세스는 닫힌(CLOSED) 델타 rowgroup을 압축하기 위해 주기적으로 작동합니다.The background tuple-mover (TM) process wakes up periodically to compress CLOSED delta rowgroups. 튜플 이동기가 지연되는 경우 REORGANIZE를 사용하는 것이 좋습니다.We recommend using REORGANIZE when tuple-mover is falling behind. REORGANIZE는 rowgroup를 더 적극적으로 압축할 수 있습니다.REORGANIZE can compress rowgroups more aggressively.
  • 모든 OPEN 및 CLOSED 행 그룹을 압축하려면 이 섹션의 REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS) 옵션을 참조하세요.To compress all OPEN and CLOSED rowgroups, see the REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS) option in this section.

SQL ServerSQL Server(SQL Server 2016(13.x)SQL Server 2016 (13.x)부터) 및 Azure SQL DatabaseAzure SQL Database의 columnstore 인덱스의 경우, REORGANIZE는 다음과 같은 추가 조각 모음 최적화를 온라인으로 수행합니다.For columnstore indexes in SQL ServerSQL Server (Starting with SQL Server 2016(13.x)SQL Server 2016 (13.x)) and Azure SQL DatabaseAzure SQL Database, REORGANIZE performs the following additional defragmentation optimizations online:

  • 행의 10% 이상이 논리적으로 삭제된 경우 rowgroup에서 행을 물리적으로 제거합니다.Physically removes rows from a rowgroup when 10% or more of the rows have been logically deleted. 삭제된 바이트는 물리적 미디어에서 회수됩니다.The deleted bytes are reclaimed on the physical media. 예를 들어 행 1백만 개의 압축된 행 그룹이 삭제된 행 10만 개를 포함하는 경우, SQL ServerSQL Server는 삭제된 행을 제거하고 행이 90만 개인 rowgroup을 다시 압축합니다.For example, if a compressed row group of 1 million rows has 100K rows deleted, SQL ServerSQL Server will remove the deleted rows and recompress the rowgroup with 900k rows. 즉, 삭제된 행을 제거하여 스토리지를 절약합니다.It saves on the storage by removing deleted rows.

  • 하나 이상의 압축된 rowgroup을 결합하여 rowgroup당 행 수를 최대 1,048,576개로 증가시킵니다.Combines one or more compressed rowgroups to increase rows per rowgroup up to the maximum of 1,048,576 rows. 예를 들어 행 102,400개의 대량 가져오기 5회를 수행하면 압축된 rowgroup 5개를 얻습니다.For example, if you bulk import 5 batches of 102,400 rows you will get 5 compressed rowgroups. REORGANIZE를 실행하면 이러한 rowgroup이 크기 512,000행의 압축된 rowgroup 1개로 병합됩니다.If you run REORGANIZE, these rowgroups will get merged into 1 compressed rowgroup of size 512,000 rows. 이때 사전 크기 또는 메모리 제한이 없는 것으로 가정합니다.This assumes there were no dictionary size or memory limitations.

  • 행의 10% 이상이 논리적으로 삭제된 행 그룹의 경우 SQL ServerSQL Server는 이 행 그룹을 하나 이상의 행 그룹과 결합하려고 시도합니다.For rowgroups in which 10% or more of the rows have been logically deleted, SQL ServerSQL Server will try to combine this rowgroup with one or more rowgroups. 예를 들어 rowgroup 1이 행 500,000개를 사용하여 압축된다면 rowgroup 21은 최대 1,048,576개의 행을 사용하여 압축됩니다.For example, rowgroup 1 is compressed with 500,000 rows and rowgroup 21 is compressed with the maximum of 1,048,576 rows. 즉, rowgroup 21은 삭제된 행 60%와 남은 행 409,830개를 포함합니다.Rowgroup 21 has 60% of the rows deleted which leaves 409,830 rows. SQL ServerSQL Server는 이러한 두 행 그룹을 결합하여 909,830개의 행을 포함한 새 행 그룹을 압축하는 방법을 선호합니다.favors combining these two rowgroups to compress a new rowgroup that has 909,830 rows.

REORGANIZE WITH ( COMPRESS_ALL_ROW_GROUPS = { ON | OFF } )REORGANIZE WITH ( COMPRESS_ALL_ROW_GROUPS = { ON | OFF } )
columnstore 인덱스에 적용됩니다.Applies to columnstore indexes.

적용 대상: SQL ServerSQL Server (SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2016(13.x)SQL Server 2016 (13.x)) and Azure SQL DatabaseAzure SQL Database

COMPRESS_ALL_ROW_GROUPS는 열린(OPEN) 또는 닫힌(CLOSED) 델타 rowgroup을 columnstore로 강제 적용하는 방법을 제공합니다.COMPRESS_ALL_ROW_GROUPS provides a way to force OPEN or CLOSED delta rowgroups into the columnstore. 이 옵션을 사용할 때 델타 rowgroup을 비우기 위해 columnstore 인덱스를 다시 작성할 필요는 없습니다.With this option, it is not necessary to rebuild the columnstore index to empty the delta rowgroups. 이 옵션은 다른 제거 및 병합 조각 모음 기능과 함께 결합할 경우 대부분의 상황에서 더 이상 인덱스를 다시 작성할 필요가 없습니다.This, combined with the other remove and merge defragmentation features makes it no longer necessary to rebuild the index in most situations.

  • ON은 크기 및 상태(CLOSED 또는 OPEN)와 상관없이 모든 rowgroup을 columnstore에 강제 적용합니다.ON forces all rowgroups into the columnstore, regardless of size and state (CLOSED or OPEN).
  • OFF는 모든 닫힌(CLOSED) rowgroup을 columnstore에 강제 적용합니다.OFF forces all CLOSED rowgroups into the columnstore.

자세한 내용은 인덱스 다시 구성 및 다시 작성을 참조하세요.For more information, see Reorganize and Rebuild Indexes.

SET ( <set_index option> [ , ... n] )SET ( <set_index option> [ ,... n] )
인덱스를 다시 작성하거나 다시 구성하지 않고 인덱스 옵션을 지정합니다.Specifies index options without rebuilding or reorganizing the index. 비활성 인덱스에는 SET을 지정할 수 없습니다.SET cannot be specified for a disabled index.

PAD_INDEX = { ON | OFF }PAD_INDEX = { ON | OFF }

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

인덱스 패딩을 지정합니다.Specifies index padding. 기본값은 OFF입니다.The default is OFF.

켜기ON
FILLFACTOR로 지정된 사용 가능한 공간의 비율이 인덱스의 중간 수준 페이지에 적용됩니다.The percentage of free space that is specified by FILLFACTOR is applied to the intermediate-level pages of the index. FILLFACTOR를 지정함과 동시에 PAD_INDEX를 ON으로 설정하지 않으면 sys.indexes에 저장된 채우기 비율 값이 사용됩니다.If FILLFACTOR is not specified at the same time PAD_INDEX is set to ON, the fill factor value stored in sys.indexes is used.

OFF 또는 fillfactor를 지정되지 않음OFF or fillfactor is not specified
중간 수준 페이지는 용량 한도 가까이 채워집니다.The intermediate-level pages are filled to near capacity. 이로 인해 중간 페이지의 키 집합을 기준으로 인덱스에 포함될 수 있는 최대 크기의 행 하나 이상을 위한 충분한 공간이 남겨집니다.This leaves sufficient space for at least one row of the maximum size that the index can have, based on the set of keys on the intermediate pages.

자세한 내용은 CREATE INDEX(Transact-SQL)를 참조하세요.For more information, see CREATE INDEX (Transact-SQL).

FILLFACTOR = fillfactorFILLFACTOR = fillfactor

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

인덱스를 만들거나 변경할 때 데이터베이스 엔진Database Engine이 각 인덱스 페이지의 리프 수준을 채우는 비율을 지정합니다.Specifies a percentage that indicates how full the 데이터베이스 엔진Database Engine should make the leaf level of each index page during index creation or alteration. fillfactor는 1에서 100 사이의 정수 값이어야 하며fillfactor must be an integer value from 1 to 100. 기본값은 0입니다.The default is 0. 채우기 비율 값 0과 100은 모든 면에서 동일합니다.Fill factor values 0 and 100 are the same in all respects.

명시적 FILLFACTOR 설정은 인덱스를 처음 만들거나 다시 작성할 때만 적용됩니다.An explicit FILLFACTOR setting applies only when the index is first created or rebuilt. 데이터베이스 엔진Database Engine에서는 페이지에 지정된 비율의 빈 공간을 동적으로 유지하지 않습니다.The 데이터베이스 엔진Database Engine does not dynamically keep the specified percentage of empty space in the pages. 자세한 내용은 CREATE INDEX(Transact-SQL)를 참조하세요.For more information, see CREATE INDEX (Transact-SQL).

채우기 비율 설정을 보려면 sys.indexes를 사용하세요.To view the fill factor setting, use sys.indexes.

중요

데이터베이스 엔진Database Engine에서는 클러스터형 인덱스를 만들 때 데이터를 다시 배포하므로 FILLFACTOR 값으로 클러스터형 인덱스를 만들거나 변경하면 데이터가 차지하는 스토리지 공간 크기에 영향이 미칩니다.Creating or altering a clustered index with a FILLFACTOR value affects the amount of storage space the data occupies, because the 데이터베이스 엔진Database Engine redistributes the data when it creates the clustered index.

SORT_IN_TEMPDB = { ON | OFF }SORT_IN_TEMPDB = { ON | OFF }

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

tempdb에 정렬 결과를 저장할지 여부를 지정합니다.Specifies whether to store the sort results in tempdb. Azure SQL Database 하이퍼스케일을 제외하고 기본값은 OFF입니다.The default is OFF except for Azure SQL Database Hyperscale. 하이퍼스케일의 모든 인덱스 다시 작성 작업의 경우, 다시 시작 가능한 인덱스 다시 작성을 사용하지 않는 한 지정된 옵션에 관계없이 SORT_IN_TEMPDB는 항상 ON입니다.For all index rebuild operations in Hyperscale, SORT_IN_TEMPDB is always ON, regardless of the option specified unless resumable index rebuild is used.

켜기ON
인덱스 작성에 사용된 중간 정렬 결과가 tempdb에 저장됩니다.The intermediate sort results that are used to build the index are stored in tempdb. tempdb가 사용자 데이터베이스와는 다른 디스크 집합에 있으면 인덱스를 만드는 데 필요한 시간이 줄어들 수 있습니다.If tempdb is on a different set of disks than the user database, this may reduce the time needed to create an index. 그러나 인덱스 작성 중에 사용되는 디스크 공간의 크기는 커집니다.However, this increases the amount of disk space that is used during the index build.

OFFOFF
중간 정렬 결과가 인덱스와 같은 데이터베이스에 저장됩니다.The intermediate sort results are stored in the same database as the index.

정렬 작업이 필요하지 않거나 메모리에서 정렬을 수행할 수 있으면 SORT_IN_TEMPDB 옵션이 무시됩니다.If a sort operation is not required, or if the sort can be performed in memory, the SORT_IN_TEMPDB option is ignored.

자세한 내용은 인덱스에 대한 SORT_IN_TEMPDB 옵션을 참조하세요.For more information, see SORT_IN_TEMPDB Option For Indexes.

IGNORE_DUP_KEY = { ON | OFF }IGNORE_DUP_KEY = { ON | OFF }
삽입 작업에서 고유 인덱스에 중복된 키 값을 삽입하려는 경우에 대한 오류 응답을 지정합니다.Specifies the error response when an insert operation attempts to insert duplicate key values into a unique index. IGNORE_DUP_KEY 옵션은 인덱스를 만들거나 다시 작성한 후의 삽입 작업에만 적용됩니다.The IGNORE_DUP_KEY option applies only to insert operations after the index is created or rebuilt. 기본값은 OFF입니다.The default is OFF.

켜기ON
중복된 키 값이 고유 인덱스에 삽입되는 경우 경고 메시지가 나타나고A warning message will occur when duplicate key values are inserted into a unique index. 고유성 제약 조건을 위반하는 행만 실패합니다.Only the rows violating the uniqueness constraint will fail.

OFFOFF
중복된 키 값이 고유 인덱스에 삽입되는 경우 오류 메시지가 나타나고An error message will occur when duplicate key values are inserted into a unique index. 전체 INSERT 작업이 롤백됩니다.The entire INSERT operation will be rolled back.

뷰, 비고유 인덱스, XML 인덱스, 공간 인덱스 및 필터링된 인덱스에 생성된 인덱스의 경우 IGNORE_DUP_KEY를 ON으로 설정할 수 없습니다.IGNORE_DUP_KEY cannot be set to ON for indexes created on a view, non-unique indexes, XML indexes, spatial indexes, and filtered indexes.

IGNORE_DUP_KEY를 보려면 sys.indexes를 사용하세요.To view IGNORE_DUP_KEY, use sys.indexes.

이전 버전과 호환되는 구문에서 WITH IGNORE_DUP_KEY는 WITH IGNORE_DUP_KEY = ON과 같습니다.In backward compatible syntax, WITH IGNORE_DUP_KEY is equivalent to WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { ON | OFF }STATISTICS_NORECOMPUTE = { ON | OFF }
배포 통계를 다시 계산할지 여부를 지정합니다.Specifies whether distribution statistics are recomputed. 기본값은 OFF입니다.The default is OFF.

켜기ON
이전 통계가 자동으로 다시 계산되지 않습니다.Out-of-date statistics are not automatically recomputed.

OFFOFF
자동 통계 업데이트가 설정됩니다.Automatic statistics updating are enabled.

자동 통계 업데이트를 복원하려면 STATISTICS_NORECOMPUTE를 OFF로 설정하거나 NORECOMPUTE 절 없이 UPDATE STATISTICS를 실행합니다.To restore automatic statistics updating, set the STATISTICS_NORECOMPUTE to OFF, or execute UPDATE STATISTICS without the NORECOMPUTE clause.

중요

배포 통계 자동 재계산 기능을 사용하지 않도록 설정하면 쿼리 최적화 프로그램에서 테이블과 관련된 쿼리에 대해 최적의 실행 계획을 선택할 수 없습니다.Disabling automatic recomputation of distribution statistics may prevent the Query Optimizer from picking optimal execution plans for queries that involve the table.

STATISTICS_INCREMENTAL = { ON | OFF }STATISTICS_INCREMENTAL = { ON | OFF }

적용 대상: SQL ServerSQL Server (SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2014(12.x)SQL Server 2014 (12.x)) and Azure SQL DatabaseAzure SQL Database

ON으로 설정된 경우 파티션 통계별로 통계가 작성됩니다.When ON, the statistics created are per partition statistics. OFF로 설정된 경우 통계 트리가 삭제되고 SQL ServerSQL Server에서 통계를 다시 계산합니다.When OFF, the statistics tree is dropped and SQL ServerSQL Server re-computes the statistics. 기본값은 OFF입니다.The default is OFF.

파티션별 통계가 지원되지 않는 경우에는 이 옵션이 무시되고 경고가 생성됩니다.If per partition statistics are not supported the option is ignored and a warning is generated. 다음 통계 유형에 대해서는 증분 통계가 지원되지 않습니다.Incremental stats are not supported for following statistics types:

  • 기본 테이블을 기준으로 파티션 정렬되지 않은 인덱스를 사용하여 작성된 통계Statistics created with indexes that are not partition-aligned with the base table
  • Always On 읽기 가능한 보조 데이터베이스에 대해 작성된 통계Statistics created on Always On readable secondary databases
  • 읽기 전용 데이터베이스에 대해 작성된 통계Statistics created on read-only databases
  • 필터링된 인덱스에 대해 작성된 통계Statistics created on filtered indexes
  • 뷰에 대해 작성된 통계Statistics created on views
  • 내부 테이블에 대해 작성된 통계Statistics created on internal tables
  • 공간 인덱스 또는 XML 인덱스를 사용하여 작성된 통계Statistics created with spatial indexes or XML indexes

ONLINE = { ON | OFF } <as applies to rebuild_index_option>ONLINE = { ON | OFF } <as applies to rebuild_index_option>
인덱스 작업 중 쿼리 및 데이터 수정에 기본 테이블과 관련 인덱스를 사용할 수 있는지 여부를 지정합니다.Specifies whether underlying tables and associated indexes are available for queries and data modification during the index operation. 기본값은 OFF입니다.The default is OFF.

XML 인덱스 또는 공간 인덱스의 경우 ONLINE = OFF만 지원되며 ONLINE을 ON으로 설정하면 오류가 발생합니다.For an XML index or spatial index, only ONLINE = OFF is supported, and if ONLINE is set to ON an error is raised.

중요

온라인 인덱스 작업은 일부 MicrosoftMicrosoft SQL ServerSQL Server 버전에서 사용할 수 없습니다.Online index operations are not available in every edition of MicrosoftMicrosoft SQL ServerSQL Server. SQL ServerSQL Server 버전에서 지원되는 기능 목록은 SQL Server 2016(13.x)SQL Server 2016 (13.x)에 대한 버전 및 지원되는 기능SQL Server 2017에 대한 버전 및 지원되는 기능을 참조하세요.For a list of features that are supported by the editions of SQL ServerSQL Server, see Editions and Supported Features for SQL Server 2016(13.x)SQL Server 2016 (13.x) and Editions and Supported Features for SQL Server 2017.

켜기ON
인덱스 작업 중에 장기 테이블 잠금이 유지되지 않습니다.Long-term table locks are not held for the duration of the index operation. 인덱스 작업의 주 단계 중 내재된 공유(IS) 잠금만 원본 테이블에 유지됩니다.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. 따라서 기본 테이블 및 인덱스를 계속 쿼리 또는 업데이트할 수 있습니다.This allows queries or updates to the underlying table and indexes to continue. 작업이 시작될 때 아주 짧은 기간 동안 S(공유) 잠금이 원본 개체에서 유지됩니다.At the start of the operation, a Shared (S) lock is very briefly held on the source object. 작업이 끝날 때 짧은 기간 동안 비클러스터형 인덱스가 생성되는 경우에는 원본에 대해 S(공유) 잠금이 유지되고, 온라인 상태에서 클러스터형 인덱스가 생성 또는 삭제될 때나 클러스터형 또는 비클러스터형 인덱스가 다시 작성될 때는 SCH-M(스키마 수정) 잠금이 획득됩니다.At the end of the operation, an S lock is very briefly held on the source if a nonclustered index is being created, or an SCH-M (Schema Modification) lock is acquired when a clustered index is created or dropped online, or when a clustered or nonclustered index is being rebuilt. 로컬 임시 테이블에서 인덱스를 생성하는 경우에는 ONLINE을 ON으로 설정할 수 없습니다.ONLINE cannot be set to ON when an index is being created on a local temporary table.

OFFOFF
인덱스 작업 중에 테이블 잠금이 적용됩니다.Table locks are applied for the duration of the index operation. 클러스터형 인덱스, 공간 인덱스 또는 XML 인덱스를 생성, 다시 작성 또는 삭제하거나 비클러스터형 인덱스를 다시 작성 또는 삭제하는 오프라인 인덱스 작업은 테이블에 대해 SCH-M(스키마 수정) 잠금을 획득합니다.An offline index operation that creates, rebuilds, or drops a clustered, spatial, or XML index, or rebuilds or drops a nonclustered index, acquires a Schema modification (Sch-M) lock on the table. 이 경우 작업 중에 모든 사용자가 기본 테이블에 액세스할 수 없게 됩니다.This prevents all user access to the underlying table for the duration of the operation. 비클러스터형 인덱스를 만드는 오프라인 인덱스 작업을 통해 테이블의 S(공유) 잠금을 획득합니다.An offline index operation that creates a nonclustered index acquires a Shared (S) lock on the table. 따라서 기본 테이블을 업데이트할 수 없지만 SELECT 문과 같은 읽기 작업은 허용됩니다.This prevents updates to the underlying table but allows read operations, such as SELECT statements.

자세한 내용은 Perform Index Operations Online을 참조하세요.For more information, see Perform Index Operations Online.

전역 임시 테이블의 인덱스를 비롯한 인덱스를 온라인으로 다시 빌드할 수 있습니다. 단, 다음 사례는 예외입니다.Indexes, including indexes on global temp tables, can be rebuilt online except for the following cases:

  • XML 인덱스XML index
  • 로컬 임시 테이블의 인덱스Index on a local temp table
  • 뷰의 초기 고유 클러스터형 인덱스Initial unique clustered index on a view
  • columnstore 인덱스Columnstore indexes
  • 기본 테이블이 LOB 데이터 형식(image, ntext, text) 및 공간 데이터 형식을 포함하는 경우 클러스터형 인덱스입니다.Clustered index, if the underlying table contains LOB data types (image, ntext, text) and spatial data types
  • varchar(max)varbinary(max) 열은 인덱스의 일부일 수 없습니다.varchar(max) and varbinary(max) columns cannot be part of an index. SQL ServerSQL Server(SQL Server 2012(11.x)SQL Server 2012 (11.x)부터) 및 Azure SQL DatabaseAzure SQL Database에서 테이블에 varchar(최대) 또는 varbinary(최대) 열이 포함된 경우 ONLINE 옵션을 사용하여 다른 열을 포함하는 클러스터형 인덱스를 빌드하거나 다시 빌드할 수 있습니다.In SQL ServerSQL Server (Starting with SQL Server 2012(11.x)SQL Server 2012 (11.x)) and Azure SQL DatabaseAzure SQL Database, when a table contains varchar(max) or varbinary(max) columns, a clustered index containing other columns can be built or rebuilt using the ONLINE option. Azure SQL DatabaseAzure SQL Database는 기본 테이블에 varchar(최대) 또는 varbinary(최대) 열이 포함된 경우 ONLINE 옵션을 허용하지 않습니다.does not permit the ONLINE option when the base table contains varchar(max) or varbinary(max) columns

자세한 내용은 온라인 인덱스 작업의 작동 원리를 참조하세요.For more information, see How Online Index Operations Work.

RESUMABLE = { ON | OFF}RESUMABLE = { ON | OFF}

적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x)) and Azure SQL DatabaseAzure SQL Database

온라인 인덱스 작업이 다시 시작될 수 있는지 여부를 지정합니다.Specifies whether an online index operation is resumable.

ON 인덱스 작업이 다시 시작될 수 있습니다.ON Index operation is resumable.

OFF 인덱스 작업이 다시 시작될 수 없습니다.OFF Index operation is not resumable.

MAX_DURATION = time [MINUTES]는 RESUMABLE = ON 상태에서 사용됩니다(ONLINE = ON 필요).MAX_DURATION = time [MINUTES] used with RESUMABLE = ON (requires ONLINE = ON).

적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x)) and Azure SQL DatabaseAzure SQL Database

다시 시작할 수 있는 온라인 인덱스 작업이 일시 중지하기 전에 실행된 시간을 나타냅니다(분 단위로 지정된 정수 값).Indicates time (an integer value specified in minutes) that a resumable online index operation is executed before being paused.

중요

온라인으로 수행할 수 있는 인덱스 작업에 대한 자세한 내용은 온라인 인덱스 작업 지침을 참조하세요.For more detailed information about index operations that can be performed online, see Guidelines for Online Index Operations.

참고

columnstore 인덱스에서는 다시 시작 가능한 온라인 인덱스 다시 빌드가 지원되지 않습니다.Resumable online index rebuilds are not supported on columnstore indexes.

ALLOW_ROW_LOCKS = { ON | OFF }ALLOW_ROW_LOCKS = { ON | OFF }

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

행 잠금의 허용 여부를 지정합니다.Specifies whether row locks are allowed. 기본값은 ON입니다.The default is ON.

켜기ON
인덱스에 액세스할 때 행 잠금이 허용됩니다.Row locks are allowed when accessing the index. 행 잠금을 사용하는 시점은 데이터베이스 엔진Database Engine이 결정합니다.The 데이터베이스 엔진Database Engine determines when row locks are used.

OFFOFF
행 잠금이 사용되지 않습니다.Row locks are not used.

ALLOW_PAGE_LOCKS = { ON | OFF }ALLOW_PAGE_LOCKS = { ON | OFF }

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

페이지 잠금의 허용 여부를 지정합니다.Specifies whether page locks are allowed. 기본값은 ON입니다.The default is ON.

켜기ON
인덱스에 액세스할 때 페이지 잠금이 허용됩니다.Page locks are allowed when you access the index. 페이지 잠금을 사용하는 시점은 데이터베이스 엔진Database Engine이 결정합니다.The 데이터베이스 엔진Database Engine determines when page locks are used.

OFFOFF
페이지 잠금이 사용되지 않습니다.Page locks are not used.

참고

ALLOW_PAGE_LOCKS가 OFF로 설정되면 인덱스를 다시 구성할 수 없습니다.An index cannot be reorganized when ALLOW_PAGE_LOCKS is set to OFF.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }

적용 대상: SQL ServerSQL Server (SQL Server 2019 (15.x)SQL Server 2019 (15.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2019 (15.x)SQL Server 2019 (15.x)) and Azure SQL DatabaseAzure SQL Database

마지막 페이지 삽입 경합에 최적화할지 여부를 지정합니다.Specifies whether or not to optimize for last-page insert contention. 기본값은 OFF입니다.The default is OFF. 자세한 내용은 CREATE INDEX 페이지의 순차 키 섹션을 참조하세요.See the Sequential Keys section of the CREATE INDEX page for more information.

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

인덱스 작업 기간 동안 max degree of parallelism 구성 옵션을 재정의합니다.Overrides the max degree of parallelism configuration option for the duration of the index operation. 자세한 내용은 max degree of parallelism 서버 구성 옵션 구성을 참조하세요.For more information, see Configure the max degree of parallelism Server Configuration Option. MAXDOP를 사용하여 병렬 계획 실행에 사용되는 프로세서 수를 제한할 수 있습니다.Use MAXDOP to limit the number of processors used in a parallel plan execution. 최대값은 64개입니다.The maximum is 64 processors.

중요

MAXDOP 옵션은 모든 XML 인덱스에 대해 구문으로는 지원되지만 공간 인덱스 또는 기본 XML 인덱스의 경우 ALTER INDEX는 현재 단일 프로세서만 사용합니다.Although the MAXDOP option is syntactically supported for all XML indexes, for a spatial index or a primary XML index, ALTER INDEX currently uses only a single processor.

max_degree_of_parallelism은 다음 중 하나일 수 있습니다.max_degree_of_parallelism can be:

11
병렬 계획이 생성되지 않습니다.Suppresses parallel plan generation.

>1>1
병렬 인덱스 작업에 사용되는 최대 프로세서 수를 지정된 값으로 제한합니다.Restricts the maximum number of processors used in a parallel index operation to the specified number.

0(기본값)0 (default)
현재 시스템 작업에 따라 실제 프로세서 수 이하의 프로세서를 사용합니다.Uses the actual number of processors or fewer based on the current system workload.

자세한 내용은 병렬 인덱스 작업 구성을 참조하세요.For more information, see Configure Parallel Index Operations.

참고

병렬 인덱스 작업은 일부 SQL ServerSQL Server 버전에서 사용할 수 있습니다.Parallel index operations are not available in every edition of SQL ServerSQL Server. SQL ServerSQL Server 버전에서 지원되는 기능 목록은 SQL Server 2016 버전에 대한 버전 및 지원하는 기능을 참조하세요.For a list of features that are supported by the editions of SQL ServerSQL Server, see Editions and Supported Features for SQL Server 2016.

COMPRESSION_DELAY = { 0 |duration [Minutes] }COMPRESSION_DELAY = { 0 |duration [Minutes] }

적용 대상: SQL ServerSQL Server (SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 시작)Applies to: SQL ServerSQL Server (Starting with SQL Server 2016(13.x)SQL Server 2016 (13.x))

디스크 기반 테이블의 경우 지연은 CLOSED 상태의 델타 rowgroup을 SQL ServerSQL Server에서 압축된 rowgroup으로 압축할 수 있게 될 때까지 델타 rowgroup에 남아 있어야 하는 최소 시간(분)을 지정합니다.For a disk-based table, delay specifies the minimum number of minutes a delta rowgroup in the CLOSED state must remain in the delta rowgroup before SQL ServerSQL Server can compress it into the compressed rowgroup. 디스크 기반 테이블은 개별 행에 대한 삽입 및 업데이트 시간을 추적하지 않으므로 SQL ServerSQL Server가 CLOSED 상태의 델타 rowgroup에 지연을 적용합니다.Since disk-based tables don't track insert and update times on individual rows, SQL ServerSQL Server applies the delay to delta rowgroups in the CLOSED state.

기본값은 0분입니다.The default is 0 minutes.

COMPRESSION_DELAY 사용 시기에 관한 권장 사항은 실시간 운영 분석을 위한 Columnstore 시작을 참조하세요.For recommendations on when to use COMPRESSION_DELAY, see Get started with Columnstore for real time operational analytics.

DATA_COMPRESSIONDATA_COMPRESSION
지정된 인덱스, 파티션 번호 또는 파티션 범위에 대한 데이터 압축 옵션을 지정합니다.Specifies the data compression option for the specified index, partition number, or range of partitions. 옵션은 다음과 같습니다.The options are as follows:

없음NONE
인덱스 또는 지정된 파티션이 압축되지 않습니다.Index or specified partitions are not compressed. columnstore 인덱스에는 적용되지 않습니다.This does not apply to columnstore indexes.

ROWROW
인덱스 또는 지정된 파티션이 행 압축을 사용하여 압축됩니다.Index or specified partitions are compressed by using row compression. columnstore 인덱스에는 적용되지 않습니다.This does not apply to columnstore indexes.

PAGEPAGE
인덱스 또는 지정된 파티션이 페이지 압축을 사용하여 압축됩니다.Index or specified partitions are compressed by using page compression. columnstore 인덱스에는 적용되지 않습니다.This does not apply to columnstore indexes.

COLUMNSTORECOLUMNSTORE

적용 대상: SQL ServerSQL Server (SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2014(12.x)SQL Server 2014 (12.x)) and Azure SQL DatabaseAzure SQL Database

클러스터형 columnstore 인덱스 및 비클러스터형 columnstore 인덱스를 모두 포함하는 columnstore 인덱스에만 적용됩니다.Applies only to columnstore indexes, including both nonclustered columnstore and clustered columnstore indexes. COLUMNSTORE에서는 COLUMNSTORE_ARCHIVE 옵션으로 압축된 지정 파티션 또는 인덱스를 압축 해제하도록 지정합니다.COLUMNSTORE specifies to decompress the index or specified partitions that are compressed with the COLUMNSTORE_ARCHIVE option. 데이터는 복구될 때 모든 columnstore 인덱스에 사용된 columnstore 압축으로 계속 압축됩니다.When the data is restored, it will continue to be compressed with the columnstore compression that is used for all columnstore indexes.

COLUMNSTORE_ARCHIVECOLUMNSTORE_ARCHIVE

적용 대상: SQL ServerSQL Server (SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2014(12.x)SQL Server 2014 (12.x)) and Azure SQL DatabaseAzure SQL Database

클러스터형 columnstore 인덱스 및 비클러스터형 columnstore 인덱스를 모두 포함하는 columnstore 인덱스에만 적용됩니다.Applies only to columnstore indexes, including both nonclustered columnstore and clustered columnstore indexes. COLUMNSTORE_ARCHIVE는 지정된 파티션을 보다 작은 크기로 압축합니다.COLUMNSTORE_ARCHIVE will further compress the specified partition to a smaller size. 보다 적은 스토리지 크기가 필요한 기타 상황에서 보관하는 데 사용할 수 있으며 저장 및 검색에 더 많은 시간을 이용할 수 있습니다.This can be used for archival, or for other situations that require a smaller storage size and can afford more time for storage and retrieval.

압축에 대한 자세한 내용은 데이터 압축을 참조하세요.For more information about compression, see Data Compression.

ON PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n] )ON PARTITIONS ( { <partition_number_expression> | <range> } [,...n] )

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

DATA_COMPRESSION 설정을 적용할 파티션을 지정합니다.Specifies the partitions to which the DATA_COMPRESSION setting applies. 인덱스가 분할되지 않은 경우 ON PARTITIONS 인수를 사용하면 오류가 발생합니다.If the index is not partitioned, the ON PARTITIONS argument will generate an error. ON PARTITIONS 절을 제공하지 않으면 DATA_COMPRESSION 옵션이 분할된 인덱스의 모든 파티션에 적용됩니다.If the ON PARTITIONS clause is not provided, the DATA_COMPRESSION option applies to all partitions of a partitioned index.

<partition_number_expression>은 다음과 같은 방법으로 지정할 수 있습니다.<partition_number_expression> can be specified in the following ways:

  • 파티션의 번호를 지정합니다(예: ON PARTITIONS (2)).Provide the number for a partition, for example: ON PARTITIONS (2).
  • 여러 개별 파티션의 파티션 번호를 쉼표로 구분하여 지정합니다(예: ON PARTITIONS (1, 5)).Provide the partition numbers for several individual partitions separated by commas, for example: ON PARTITIONS (1, 5).
  • 범위와 개별 파티션을 모두 지정합니다(예: ON PARTITIONS (2, 4, 6 TO 8)).Provide both ranges and individual partitions: ON PARTITIONS (2, 4, 6 TO 8).

<range>는 TO라는 단어로 구분된 파티션 번호로 지정할 수 있습니다(예: ON PARTITIONS (6 TO 8)).<range> can be specified as partition numbers separated by the word TO, for example: ON PARTITIONS (6 TO 8).

여러 파티션에 대해 서로 다른 데이터 압축 유형을 설정하려면 DATA_COMPRESSION 옵션을 두 번 이상 지정합니다. 예를 들면 다음과 같습니다.To set different types of data compression for different partitions, specify the DATA_COMPRESSION option more than once, for example:

REBUILD WITH   
(  
DATA_COMPRESSION = NONE ON PARTITIONS (1),   
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),   
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)  
);  

ONLINE = { ON | OFF } <as applies to single_partition_rebuild_index_option>ONLINE = { ON | OFF } <as applies to single_partition_rebuild_index_option>
기본 테이블의 인덱스 또는 인덱스 파티션을 온라인 또는 오프라인으로 다시 작성할 수 있는지 여부를 지정합니다.Specifies whether an index or an index partition of an underlying table can be rebuilt online or offline. REBUILD가 온라인(ON)으로 수행될 경우, 인덱스 작업 중에 이 테이블의 데이터를 쿼리 및 데이터 수정을 위해 사용할 수 있습니다.If REBUILD is performed online (ON) the data in this table is available for queries and data modification during the index operation. 기본값은 OFF입니다.The default is OFF.

켜기ON
인덱스 작업 중에 장기 테이블 잠금이 유지되지 않습니다.Long-term table locks are not held for the duration of the index operation. 인덱스 작업의 주 단계 중 내재된 공유(IS) 잠금만 원본 테이블에 유지됩니다.During the main phase of the index operation, only an Intent Share (IS) lock is held on the source table. 인덱스 다시 작성을 시작할 때 테이블에 대한 S-잠금이 필요하고 온라인 인덱스 다시 작성을 종료할 때 테이블에 대한 Sch-M 잠금이 필요합니다.An S-lock on the table is required in the Starting of the index rebuild and a Sch-M lock on the table at the end of the online index rebuild. 두 잠금 모두 짧은 메타데이터 잠금이지만 특히 Sch-M 잠금은 모든 차단 트랜잭션이 완료될 때까지 기다려야 합니다.Although both locks are short metadata locks, especially the Sch-M lock must wait for all blocking transactions to be completed. 대기 시간 동안 Sch-M 잠금은 동일 테이블에 액세스할 때 이 잠금 뒤에서 기다리는 다른 모든 트랜잭션을 차단합니다.During the wait time the Sch-M lock blocks all other transactions that wait behind this lock when accessing the same table.

참고

온라인 인덱스 다시 작성은 이 섹션의 뒷부분에서 설명하는 low_priority_lock_wait 옵션을 설정할 수 있습니다.Online index rebuild can set the low_priority_lock_wait options described later in this section.

OFFOFF
인덱스 작업 중에 테이블 잠금이 적용됩니다.Table locks are applied for the duration of the index operation. 이 경우 작업 중에 모든 사용자가 기본 테이블에 액세스할 수 없게 됩니다.This prevents all user access to the underlying table for the duration of the operation.

ONLINE=ON은 WAIT_AT_LOW_PRIORITY 상태에서만 사용됩니다.WAIT_AT_LOW_PRIORITY used with ONLINE=ON only.

적용 대상: SQL ServerSQL Server (SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2014(12.x)SQL Server 2014 (12.x)) and Azure SQL DatabaseAzure SQL Database

온라인 인덱스 다시 작성에서 이 테이블의 차단 작업을 대기해야 합니다.An online index rebuild has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY는 온라인 인덱스 작성 작업이 대기하는 동안 다른 작업을 진행할 수 있도록 온라인 인덱스 재작성 작업이 우선 순위가 낮은 잠금을 대기함을 나타냅니다.WAIT_AT_LOW_PRIORITY indicates that the online index rebuild operation will wait for low priority locks, allowing other operations to proceed while the online index build operation is waiting. WAIT AT LOW PRIORITY 옵션을 생략하는 것은 WAIT_AT_LOW_PRIORITY(MAX_DURATION = 0분, ABORT_AFTER_WAIT = NONE)와 동일합니다.Omitting the WAIT AT LOW PRIORITY option is equivalent to WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE). 자세한 내용은 WAIT_AT_LOW_PRIORITY를 참조하세요.For more information, see WAIT_AT_LOW_PRIORITY.

MAX_DURATION = time [MINUTES]MAX_DURATION = time [MINUTES]

적용 대상: SQL ServerSQL Server (SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2014(12.x)SQL Server 2014 (12.x)) and Azure SQL DatabaseAzure SQL Database

DDL 명령을 실행할 때 온라인 인덱스 다시 작성 잠금이 낮은 우선 순위로 대기하는 시간(분 단위로 지정된 정수 값)입니다.The wait time (an integer value specified in minutes) that the online index rebuild locks will wait with low priority when executing the DDL command. 작업이 MAX_DURATION 시간 동안 차단되면 ABORT_AFTER_WAIT 작업 중 하나가 실행됩니다.If the operation is blocked for the MAX_DURATION time, one of the ABORT_AFTER_WAIT actions will be executed. MAX_DURATION 시간은 항상 분 단위이며 단어 MINUTES는 생략할 수 있습니다.MAX_DURATION time is always in minutes, and the word MINUTES can be omitted.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS } ]

적용 대상: SQL ServerSQL Server (SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2014(12.x)SQL Server 2014 (12.x)) and Azure SQL DatabaseAzure SQL Database

없음NONE
보통(일반) 우선 순위로 잠금을 계속 대기합니다.Continue waiting for the lock with normal (regular) priority.

SELFSELF
어떤 동작도 수행하지 않고 현재 실행 중인 온라인 인덱스 다시 작성 DDL 작업을 종료합니다.Exit the online index rebuild DDL operation currently being executed without taking any action.

BLOCKERSBLOCKERS
작업을 계속할 수 있도록 온라인 인덱스 다시 작성 DDL 작업을 차단하는 모든 사용자 트랜잭션을 종료합니다.Kill all user transactions that block the online index rebuild DDL operation so that the operation can continue. BLOCKERS 옵션을 사용하려면 ALTER ANY CONNECTION 권한을 가진 로그인이 필요합니다.The BLOCKERS option requires the login to have ALTER ANY CONNECTION permission.

RESUMERESUME

적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x)) and Azure SQL DatabaseAzure SQL Database

수동으로 일시 중지되거나 실패로 인해 발생한 인덱스 작업을 다시 시작합니다.Resume an index operation that is paused manually or due to a failure.

MAX_DURATION은 RESUMABLE=ON 상태에서만 사용됨MAX_DURATION used with RESUMABLE=ON

적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x)) and Azure SQL DatabaseAzure SQL Database

다시 시작된 후 다시 시작할 수 있는 온라인 인덱스 작업이 실행되는 시간(분 단위로 지정한 정수 값)입니다.The time (an integer value specified in minutes) that the resumable online index operation is executed after being resumed. 시간이 만료된 후 다시 시작할 수 있는 작업이 여전히 실행 중인 경우 일시 중지됩니다.Once the time expires, the resumable operation is paused if it is still running.

WAIT_AT_LOW_PRIORITY는 RESUMABLE=ONONLINE = ON 상태에서만 사용됩니다.WAIT_AT_LOW_PRIORITY used with RESUMABLE=ON and ONLINE = ON.

적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x)) and Azure SQL DatabaseAzure SQL Database

일시 중지 후 온라인 인덱스 다시 작성을 다시 시작하려면 이 테이블에 대한 작업이 차단되기를 기다려야 합니다.Resuming an online index rebuild after a pause has to wait for blocking operations on this table. WAIT_AT_LOW_PRIORITY는 온라인 인덱스 작성 작업이 대기하는 동안 다른 작업을 진행할 수 있도록 온라인 인덱스 재작성 작업이 우선 순위가 낮은 잠금을 대기함을 나타냅니다.WAIT_AT_LOW_PRIORITY indicates that the online index rebuild operation will wait for low priority locks, allowing other operations to proceed while the online index build operation is waiting. WAIT AT LOW PRIORITY 옵션을 생략하는 것은 WAIT_AT_LOW_PRIORITY(MAX_DURATION = 0분, ABORT_AFTER_WAIT = NONE)와 동일합니다.Omitting the WAIT AT LOW PRIORITY option is equivalent to WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE). 자세한 내용은 WAIT_AT_LOW_PRIORITY를 참조하세요.For more information, see WAIT_AT_LOW_PRIORITY.

일시 중지PAUSE

적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x)) and Azure SQL DatabaseAzure SQL Database

다시 시작 가능한 온라인 인덱스 다시 작성 작업을 일시 중지합니다.Pause a resumable online index rebuild operation.

중단ABORT

적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x)) and Azure SQL DatabaseAzure SQL Database

다시 시작한 것으로 선언된 실행 중이거나 일시 중지된 인덱스 작업을 중단합니다.Abort a running or paused index operation that was declared as resumable. 다시 시작할 수 있는 인덱스 다시 작성 작업을 종료하려면 중단 명령을 명시적으로 실행해야 합니다.You have to explicitly execute an ABORT command to terminate a resumable index rebuild operation. 다시 시작할 수 있는 인덱스 작업이 실패하거나 일시 중지해도 실행이 종료되지 않으며, 그 대신 작업이 무한한 일시 중지 상태로 남아 있습니다.Failure or pausing a resumable index operation does not terminate its execution; rather, it leaves the operation in an indefinite pause state.

설명Remarks

인덱스를 다시 분할하거나 다른 파일 그룹으로 이동하는 데는 ALTER INDEX를 사용할 수 없습니다.ALTER INDEX cannot be used to repartition an index or move it to a different filegroup. 이 문을 사용하여 열 추가 또는 삭제, 열 순서 변경과 같은 인덱스 정의를 수정할 수 없습니다.This statement cannot be used to modify the index definition, such as adding or deleting columns or changing the column order. 이러한 작업을 수행하려면 DROP_EXISTING 절에 CREATE INDEX를 사용하세요.Use CREATE INDEX with the DROP_EXISTING clause to perform these operations.

옵션을 명시적으로 지정하지 않으면 현재 설정이 적용됩니다.When an option is not explicitly specified, the current setting is applied. 예를 들어, REBUILD 절에 FILLFACTOR 설정을 지정하지 않으면 다시 작성하는 동안 시스템 카탈로그에 저장된 채우기 비율 값이 사용됩니다.For example, if a FILLFACTOR setting is not specified in the REBUILD clause, the fill factor value stored in the system catalog will be used during the rebuild process. 현재 인덱스 옵션 설정을 보려면 sys.indexes를 사용하세요.To view the current index option settings, use sys.indexes.

ONLINE, MAXDOPSORT_IN_TEMPDB 값은 시스템 카탈로그에 저장되지 않습니다.The values for ONLINE, MAXDOP, and SORT_IN_TEMPDB are not stored in the system catalog. 인덱스 문에서 지정하지 않으면 해당 옵션의 기본값이 사용됩니다.Unless specified in the index statement, the default value for the option is used.

다중 프로세서 컴퓨터에서는 다른 쿼리의 경우와 마찬가지로 ALTER INDEX REBUILD가 자동으로 프로세서를 더 사용하여 인덱스 수정과 관련된 정렬 및 검색 작업을 수행합니다.On multiprocessor computers, just like other queries do, ALTER INDEX REBUILD automatically uses more processors to perform the scan and sort operations that are associated with modifying the index. ALTER INDEX REORGANIZE를 실행하는 경우 최대 병렬 처리 수준 값은 단일 스레드 작업입니다.When you run ALTER INDEX REORGANIZE, with or without LOB_COMPACTION, the max degree of parallelism value is a single threaded operation. 자세한 내용은 병렬 인덱스 작업 구성을 참조하세요.For more information, see Configure Parallel Index Operations.

중요

인덱스가 위치한 파일 그룹이 오프라인이거나 읽기 전용으로 설정되어 있으면 인덱스를 다시 구성할 수 없습니다.An index cannot be reorganized or rebuilt if the filegroup in which it is located is offline or set to read-only. ALL 키워드를 지정하면 하나 이상의 인덱스가 오프라인 또는 읽기 전용 파일 그룹에 있을 경우 해당 문이 실패합니다.When the keyword ALL is specified and one or more indexes are in an offline or read-only filegroup, the statement fails.

인덱스 다시 작성Rebuilding Indexes

인덱스를 다시 작성하면 이 인덱스가 삭제된 다음 다시 생성됩니다.Rebuilding an index drops and re-creates the index. 이렇게 하면 조각화를 제거하고, 지정된 채우기 비율 또는 기존 채우기 비율 설정을 기준으로 페이지를 압축하여 디스크 공간을 회수하고, 인덱스 행을 연속된 페이지로 다시 정렬할 수 있습니다.This removes fragmentation, reclaims disk space by compacting the pages based on the specified or existing fill factor setting, and reorders the index rows in contiguous pages. ALL을 지정하면 테이블의 모든 인덱스가 단일 트랜잭션으로 삭제되고 다시 작성됩니다.When ALL is specified, all indexes on the table are dropped and rebuilt in a single transaction. 외래 키 제약 조건은 미리 삭제하지 않아도 됩니다.Foreign key constraints do not have to be dropped in advance. 익스텐트가 128개 이상인 인덱스를 다시 작성하면 데이터베이스 엔진Database Engine에서 실제 페이지 할당 취소와 해당 관련 잠금이 트랜잭션 커밋 후까지 지연됩니다.When indexes with 128 extents or more are rebuilt, the 데이터베이스 엔진Database Engine defers the actual page deallocations, and their associated locks, until after the transaction commits.

자세한 내용은 인덱스 다시 구성 및 다시 작성을 참조하세요.For more information, see Reorganize and Rebuild Indexes.

인덱스 다시 구성Reorganizing Indexes

인덱스를 다시 구성할 때는 최소한의 시스템 리소스가 사용됩니다.Reorganizing an index uses minimal system resources. 이때는 왼쪽에서 오른쪽으로 표시되는 리프 노드의 논리적 순서에 맞도록 리프 수준 페이지를 물리적으로 다시 정렬하여 테이블 및 뷰의 클러스터형 및 비클러스터형 인덱스의 리프 수준에 대한 조각 모음을 수행합니다.It defragments the leaf level of clustered and nonclustered indexes on tables and views by physically reordering the leaf-level pages to match the logical, left to right, order of the leaf nodes. 다시 구성 작업을 수행하면 인덱스 페이지도 압축됩니다.Reorganizing also compacts the index pages. 이때 압축은 기존 채우기 비율 값을 기준으로 수행됩니다.Compaction is based on the existing fill factor value.

ALL을 지정하면 테이블에서 관계형 인덱스, 클러스터형 및 비클러스터형 모두와 XML 인덱스가 다시 구성됩니다.When ALL is specified, relational indexes, both clustered and nonclustered, and XML indexes on the table are reorganized. ALL을 지정할 때는 몇 가지 제한 사항이 적용됩니다. 이 문서의 인수 섹션에서 ALL에 대한 정의를 참조하세요.Some restrictions apply when specifying ALL, refer to the definition for ALL in the Arguments section of this article.

자세한 내용은 인덱스 다시 구성 및 다시 작성을 참조하세요.For more information, see Reorganize and Rebuild Indexes.

중요

순서가 지정된 클러스터형 columnstore 인덱스를 통한 Azure SQL Data Warehouse 테이블의 경우 ALTER INDEX REORGANIZE가 데이터를 다시 정렬하지 않습니다.For an Azure SQL Data Warehouse table with an ordered clustered columnstore index, ALTER INDEX REORGANIZE does not re-sort the data. 데이터를 다시 정렬하려면 ALTER INDEX REBUILD를 사용하세요.To resort the data use ALTER INDEX REBUILD.

인덱스 비활성화Disabling Indexes

인덱스를 비활성화하면 사용자가 인덱스에 액세스할 수 없으며 클러스터형 인덱스의 경우 기본 테이블 데이터에도 액세스할 수 없습니다.Disabling an index prevents user access to the index, and for clustered indexes, to the underlying table data. 인덱스 정의는 시스템 카탈로그에 유지됩니다.The index definition remains in the system catalog. 뷰의 비클러스터형 인덱스 또는 클러스터형 인덱스를 비활성화하면 인덱스 데이터가 물리적으로 삭제됩니다.Disabling a nonclustered index or clustered index on a view physically deletes the index data. 클러스터형 인덱스를 비활성화하면 데이터에 액세스할 수 없지만 인덱스가 삭제되거나 다시 작성될 때까지는 데이터가 B-트리에서 유지 관리되지 않는 상태로 남아 있습니다.Disabling a clustered index prevents access to the data, but the data remains unmaintained in the B-tree until the index is dropped or rebuilt. 활성 또는 비활성 인덱스의 상태를 보려면 sys.indexes 카탈로그 뷰의 is_disabled 열을 쿼리합니다.To view the status of an enabled or disabled index, query the is_disabled column in the sys.indexes catalog view.

트랜잭션 복제 게시의 테이블에서는 기본 키 열과 연결된 인덱스를 해제할 수 없습니다.If a table is in a transactional replication publication, you cannot disable any indexes that are associated with primary key columns. 이러한 인덱스는 복제에 필요합니다.These indexes are required by replication. 인덱스를 해제하려면 먼저 게시에서 테이블을 삭제해야 합니다.To disable an index, you must first drop the table from the publication. 자세한 내용은 데이터 및 데이터베이스 개체 게시를 참조하세요.For more information, see Publish Data and Database Objects.

ALTER INDEX REBUILD 문 또는 CREATE INDEX WITH DROP_EXISTING 문을 사용하여 인덱스를 사용하도록 설정합니다.Use the ALTER INDEX REBUILD statement or the CREATE INDEX WITH DROP_EXISTING statement to enable the index. ONLINE 옵션이 ON으로 설정되어 있으면 비활성화된 클러스터형 인덱스를 다시 작성할 수 없습니다.Rebuilding a disabled clustered index cannot be performed with the ONLINE option set to ON. 자세한 내용은 인덱스 및 제약 조건 비활성화를 참조하세요.For more information, see Disable Indexes and Constraints.

옵션 설정Setting Options

지정된 인덱스를 다시 빌드하거나 다시 구성하지 않고 해당 인덱스에 ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, OPTIMIZE_FOR_SEQUENTIAL_KEY``IGNORE_DUP_KEYSTATISTICS_NORECOMPUTE 옵션을 설정할 수 있습니다.You can set the options ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, OPTIMIZE_FOR_SEQUENTIAL_KEY, IGNORE_DUP_KEY and STATISTICS_NORECOMPUTE for a specified index without rebuilding or reorganizing that index. 수정된 값은 인덱스에 바로 적용됩니다.The modified values are immediately applied to the index. 이러한 설정을 보려면 sys.indexes를 사용하세요.To view these settings, use sys.indexes. 자세한 내용은 인덱스 옵션 설정을 참조하세요.For more information, see Set Index Options.

행 및 페이지 잠금 옵션Row and Page Locks Options

ALLOW_ROW_LOCKS = ON이고 ALLOW_PAGE_LOCK = ON이면 인덱스에 액세스할 때 행 수준, 페이지 수준 및 테이블 수준 잠금이 허용됩니다.When ALLOW_ROW_LOCKS = ON and ALLOW_PAGE_LOCK = ON, row-level, page-level, and table-level locks are allowed when you access the index. 데이터베이스 엔진Database Engine은 적절한 잠금을 선택하고 행 또는 페이지 잠금에서 테이블 잠금으로 잠금을 에스컬레이션할 수 있습니다.The 데이터베이스 엔진Database Engine chooses the appropriate lock and can escalate the lock from a row or page lock to a table lock.

ALLOW_ROW_LOCKS = OFF이고 ALLOW_PAGE_LOCK = OFF이면 인덱스에 액세스할 때 테이블 수준 잠금만 허용됩니다.When ALLOW_ROW_LOCKS = OFF and ALLOW_PAGE_LOCK = OFF, only a table-level lock is allowed when you access the index.

행 또는 페이지 잠금 옵션이 설정된 경우 ALL을 지정하면 설정이 모든 인덱스에 적용됩니다.If ALL is specified when the row or page lock options are set, the settings are applied to all indexes. 기본 테이블이 힙인 경우 다음과 같은 방식으로 설정이 적용됩니다.When the underlying table is a heap, the settings are applied in the following ways:

옵션Option 세부 정보Details
ALLOW_ROW_LOCKS = ON 또는 OFFALLOW_ROW_LOCKS = ON or OFF 힙 및 연결된 비클러스터형 인덱스To the heap and any associated nonclustered indexes.
ALLOW_PAGE_LOCKS = ONALLOW_PAGE_LOCKS = ON 힙 및 연결된 비클러스터형 인덱스To the heap and any associated nonclustered indexes.
ALLOW_PAGE_LOCKS = OFFALLOW_PAGE_LOCKS = OFF 비클러스터형 인덱스 전체.Fully to the nonclustered indexes. 즉, 비클러스터형 인덱스에는 모든 페이지 잠금이 허용되지 않습니다.This means that all page locks are not allowed on the nonclustered indexes. 힙에서는 페이지에 대한 공유(S), 업데이트(U) 및 배타(X) 잠금만 허용되지 않습니다.On the heap, only the shared (S), update (U) and exclusive (X) locks for the page are not allowed. 데이터베이스 엔진Database Engine에서는 내부에서 사용하기 위해 의도 페이지 잠금(IS, IU 또는 IX)을 획득할 수 있습니다.The 데이터베이스 엔진Database Engine can still acquire an intent page lock (IS, IU or IX) for internal purposes.

온라인 인덱스 작업Online Index Operations

인덱스를 다시 작성할 때 ONLINE 옵션이 ON으로 설정되어 있으면 기본 개체, 테이블 및 연결된 인덱스를 쿼리와 데이터 수정에 사용할 수 있습니다.When rebuilding an index and the ONLINE option is set to ON, the underlying objects, the tables and associated indexes, are available for queries and data modification. 단일 파티션에 있는 인덱스 부분을 온라인으로 다시 작성할 수도 있습니다.You can also rebuild online a portion of an index residing on a single partition. 변경 중에는 아주 잠시 동안만 배타적 테이블 잠금이 유지됩니다.Exclusive table locks are held only for a very short amount of time during the alteration process.

인덱스를 다시 구성하는 과정은 항상 온라인으로 수행됩니다.Reorganizing an index is always performed online. 이 프로세스는 잠금을 장기간 유지하지 않으므로 실행 중인 업데이트나 쿼리를 차단하지 않습니다.The process does not hold locks long term and, therefore, does not block queries or updates that are running.

다음을 수행할 때만 동일한 테이블 또는 테이블 파티션에서 동시 온라인 작업을 수행할 수 있습니다.You can perform concurrent online index operations on the same table or table partition only when doing the following:

  • 여러 개의 비클러스터형 인덱스 생성Creating multiple nonclustered indexes.
  • 동일한 테이블에서 여러 인덱스 다시 구성Reorganizing different indexes on the same table.
  • 동일한 테이블에서 겹치지 않는 인덱스를 다시 작성하는 동안 여러 인덱스 다시 구성Reorganizing different indexes while rebuilding nonoverlapping indexes on the same table.

동시에 수행된 다른 온라인 인덱스 작업이 모두 실패합니다.All other online index operations performed at the same time fail. 예를 들어, 동일한 테이블에서 두 개 이상의 인덱스를 다시 작성할 수 없습니다. 또는 동일한 테이블에서 기존 인덱스를 다시 작성하면서 새 인덱스를 생성할 수 없습니다.For example, you cannot rebuild two or more indexes on the same table concurrently, or create a new index while rebuilding an existing index on the same table.

다시 시작 가능한 인덱스 작업Resumable index operations

적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x)) and Azure SQL DatabaseAzure SQL Database

온라인 인덱스 다시 작성은 RESUMABLE=ON 옵션을 사용하여 다시 시작 가능한 것으로 지정됩니다.Online index rebuild is specified as resumable using the RESUMABLE = ON option.

  • RESUMABLE 옵션은 지정된 인덱스에 대해 메타데이터에서 지속되며 현재 DDL 문의 기간에만 적용됩니다.The RESUMABLE option is not persisted in the metadata for a given index and applies only to the duration of a current DDL statement. 그러므로 다시 시작이 가능하도록 하려면 RESUMABLE=ON 절을 명시적으로 지정해야 합니다.Therefore, the RESUMABLE = ON clause must be specified explicitly to enable resumability.

  • MAX_DURATION 옵션은 RESUMABLE = ON 옵션 또는 low_priority_lock_wait 인수 옵션에 대해 지원됩니다.MAX_DURATION option is supported for RESUMABLE = ON option or the low_priority_lock_wait argument option.

    • RESUMABLE에 대한 MAX_DURATION은 다시 작성하는 인덱스의 시간 간격을 지정합니다.MAX_DURATION for RESUMABLE option specifies the time interval for an index being rebuild. 이 시간이 사용된 후 인덱스 다시 작성이 일시 중지되거나 그 실행이 완료됩니다.Once this time is used the index rebuild is either paused or it completes its execution. 사용자는 일시 중지된 인덱스에 대한 다시 작성이 다시 시작될 수 있는 시기를 결정합니다.User decides when a rebuild for a paused index can be resumed. MAX_DURATION에 대한 분 단위의 시간은 0분보다 크거나 1주일(7 * 24 * 60 = 10080분) 이하여야 합니다.The time in minutes for MAX_DURATION must be greater than 0 minutes and less or equal one week (7 * 24 * 60 = 10080 minutes). 원래 인덱스와 새로 만든 인덱스 두 인덱스가 모두 디스크 공간을 필요로 하고 DML 작업 중에 업데이트되어야 하므로, 인덱스 작업을 오랫동안 일시 중지하면 특정 테이블에 대한 DML 성능 및 데이터베이스 디스크 용량에 영향을 미칠 수 있습니다.Having a long pause for an index operation may impact the DML performance on a specific table as well as the database disk capacity since both indexes the original one and the newly created one require disk space and need to be updated during DML operations. MAX_DURATION 옵션을 생략하면 인덱스 작업은 완료될 때까지 또는 실패가 발생할 때까지 계속됩니다.If MAX_DURATION option is omitted, the index operation will continue until its completion or until a failure occurs.
    • <low_priority_lock_wait> 인수 옵션을 사용하면 인덱스 작업이 SCH-M 잠금에 대해 차단될 경우 계속할 수 있는 방법을 결정할 수 있습니다.The <low_priority_lock_wait> argument option allows you to decide how the index operation can proceed when blocked on the SCH-M lock.
  • 같은 매개 변수를 지정하고 원본 ALTER INDEX REBUILD 문을 다시 실행하면 일시 중지된 인덱스 다시 작성 작업이 다시 시작됩니다.Re-executing the original ALTER INDEX REBUILD statement with the same parameters resumes a paused index rebuild operation. 또한 ALTER INDEX RESUME 문을 실행하여 일시 중지된 인덱스 다시 작성 작업을 다시 시작할 수도 있습니다.You can also resume a paused index rebuild operation by executing the ALTER INDEX RESUME statement.

  • SORT_IN_TEMPDB=ON 옵션은 다시 시작 가능한 인덱스에 대해 지원되지 않습니다.The SORT_IN_TEMPDB=ON option is not supported for resumable index

  • RESUMABLE=ON 상태의 DDL 명령은 명시적 트랜잭션 내에서 실행할 수 없습니다(begin TRAN ... commit Block에 속할 수 없습니다).The DDL command with RESUMABLE=ON cannot be executed inside an explicit transaction (cannot be part of begin tran ... commit block).

  • 일시 중지된 인덱스 작업만이 다시 시작될 수 있습니다.Only index operations that are paused are resumable.

  • 일시 중지된 인덱스 작업을 다시 시작할 때 MAXDOP 값을 새 값으로 변경할 수 있습니다.When resuming an index operation that is paused, you can change the MAXDOP value to a new value. 일시 중지된 인덱스 작업을 다시 시작할 때 MAXDOP를 지정하지 않으면 마지막 MAXDOP 값을 가져옵니다.If MAXDOP is not specified when resuming an index operation that is paused, the last MAXDOP value is taken. 인덱스 다시 작성 작업에 대해 MAXDOP 옵션을 전혀 지정하지 않으면 기본값을 가져옵니다.IF the MAXDOP option is not specified at all for index rebuild operation, the default value is taken.

  • 인덱스 작업을 즉시 일시 중지하려면 진행 중인 명령을 중지하거나(Ctrl-C) ALTER INDEX PAUSE 명령 또는 KILL session_id 명령을 실행할 수 있습니다.To pause immediately the index operation, you can stop the ongoing command (Ctrl-C) or you can execute the ALTER INDEX PAUSE command or the KILL session_id command. 명령이 일시 중지된 후 RESUME 옵션을 사용하여 다시 시작할 수 있습니다.Once the command is paused it can be resumed using RESUME option.

  • ABORT 명령은 원본 인덱스 다시 작성을 호스팅한 세션을 종료하고 인덱스 작업을 중단합니다.The ABORT command kills the session that hosted the original index rebuild and aborts the index operation

  • 다음을 제외하고 다시 시작 가능한 인덱스 다시 작성을 위해 필요한 추가 리소스는 없습니다.No extra resources are required for resumable index rebuild except for

    • 인덱스가 일시 중지될 시간을 포함하여 작성 중인 인덱스를 유지하기 위해 필요한 추가 공간Additional space required to keep the index being built, including the time when index is being paused
    • DDL 수정을 하지 못하게 하는 DDL 상태A DDL state preventing any DDL modification
  • 고스트 정리는 인덱스 일시 중지 단계 중에 실행되지만 인덱스 실행 중에 일시 중지됩니다.The ghost cleanup will be running during the index pause phase, but it will be paused during index run
    다음 기능은 다시 시작 가능한 인덱스 다시 작성 작업에 대해 비활성화됩니다.The following functionality is disabled for resumable index rebuild operations

    • 비활성화된 인덱스 다시 작성은 RESUMABLE=ON 상태에서 지원되지 않습니다.Rebuilding an index that is disabled is not supported with RESUMABLE=ON
    • ALTER INDEX REBUILD ALL 명령ALTER INDEX REBUILD ALL command
    • 인덱스 다시 작성을 사용한 ALTER TABLEALTER TABLE using index rebuild
    • “RESUMABLE=ON” 상태의 DDL 명령은 명시적 트랜잭션 내에서 실행할 수 없습니다(begin TRAN ... commit Block에 속할 수 없습니다)DDL command with "RESUMEABLE = ON" cannot be executed inside an explicit transaction (cannot be part of begin tran ... commit block)
    • 계산되었거나 TIMESTAMP 열을 키 열로 포함하는 인덱스를 다시 작성합니다.Rebuild an index that has computed or TIMESTAMP column(s) as key columns.
  • LOB 열을 포함하는 기본 테이블의 경우 다시 시작 가능한 클러스터형 인덱스를 다시 작성하려면 이 작업의 시작 부분에 Sch-M 잠금이 필요합니다.In case the base table contains LOB column(s) resumable clustered index rebuild requires a Sch-M lock in the Starting of this operation

참고

DDL 명령은 완료, 일시 중지 또는 실패할 때까지 실행됩니다.The DDL command runs until it completes, pauses or fails. 명령이 일시 중지된 경우 작업이 일시 중지되었고 인덱스 만들기가 완료되지 않았음을 알려 주는 오류가 발생합니다.In case the command pauses, an error will be issued indicating that the operation was paused and that the index creation did not complete. 현재 인덱스 상태에 대한 더 자세한 내용은 sys.index_resumable_operations에서 가져올 수 있습니다.More information about the current index status can be obtained from sys.index_resumable_operations. 이전과 마찬가지로 실패의 경우 오류도 발생합니다.As before in case of a failure an error will be issued as well.

자세한 내용은 Perform Index Operations Online을 참조하세요.For more information, see Perform Index Operations Online.

온라인 인덱스 작업에 대한 WAIT_AT_LOW_PRIORITYWAIT_AT_LOW_PRIORITY with online index operations

온라인 인덱스 다시 작성을 위해 DDL 문을 실행하려면 특정 테이블에서 실행 중인 모든 활성 차단 트랜잭션이 완료되어야 합니다.In order to execute the DDL statement for an online index rebuild, all active blocking transactions running on a particular table must be completed. 온라인 인덱스 다시 작성이 실행되면 이 테이블에서 실행을 시작할 준비가 되어 있는 모든 새로운 트랜잭션이 차단됩니다.When the online index rebuild executes, it blocks all new transactions that are ready to start execution on this table. 온라인 인덱스 다시 작성에 대한 잠금 기간은 매우 짧지만 특정 테이블에서 열려 있는 모든 트랜잭션이 완료될 때까지 기다리고 새로운 트랜잭션이 시작되지 않도록 차단하기 위해서는 처리량에 상당한 영향을 주어 작업 속도가 느려지거나 시간 초과가 발생할 수 있으며, 기본 테이블에 대한 액세스가 크게 제한될 수 있습니다.Although the duration of the lock for online index rebuild is very short, waiting for all open transactions on a given table to complete and blocking the new transactions to start, might significantly affect the throughput, causing a workload slow down or timeout, and significantly limit access to the underlying table. DBA는 WAIT_AT_LOW_PRIORITY 옵션을 사용해서 온라인 인덱스 다시 작성에 필요한 S-잠금 및 Sch-M 잠금을 관리할 수 있으며, 3개 옵션 중 하나를 선택할 수 있습니다.The WAIT_AT_LOW_PRIORITY option allows DBA's to manage the S-lock and Sch-M locks required for online index rebuilds and allows them to select one of 3 options. 세 가지 경우 모두, 대기 시간((MAX_DURATION = n [minutes])) 중에 차단 활동이 없으면 대기 없이 온라인 인덱스 다시 작성이 즉시 실행되고 DDL 문이 완료됩니다.In all 3 cases, if during the wait time ( (MAX_DURATION = n [minutes]) ), there are no blocking activities, the online index rebuild is executed immediately without waiting and the DDL statement is completed.

공간 인덱스 제한 사항Spatial Index Restrictions

공간 인덱스를 다시 작성할 때는 공간 인덱스에 스키마 잠금이 유지되기 때문에 인덱스 작업 중에 기본 사용자 테이블을 사용할 수 없습니다.When you rebuild a spatial index, the underlying user table is unavailable for the duration of the index operation because the spatial index holds a schema lock.

공간 인덱스가 해당 테이블의 열에 정의된 경우 사용자 테이블에 있는 PRIMARY KEY 제약 조건을 수정할 수 없습니다.The PRIMARY KEY constraint in the user table cannot be modified while a spatial index is defined on a column of that table. PRIMARY KEY 제약 조건을 변경하려면 먼저 테이블의 모든 공간 인덱스를 삭제해야 합니다.To change the PRIMARY KEY constraint, first drop every spatial index of the table. PRIMARY KEY 제약 조건을 수정한 후에는 각 공간 인덱스를 다시 만들 수 있습니다.After modifying the PRIMARY KEy constraint, you can re-create each of the spatial indexes.

단일 파티션 다시 작성 작업에서는 공간 인덱스를 지정할 수 없습니다.In a single partition rebuild operation, you cannot specify any spatial indexes. 하지만 전체 파티션을 다시 작성할 때는 공간 인덱스를 지정할 수 있습니다.However, you can specify spatial indexes in a complete partition rebuild.

공간 인덱스에 지정된 옵션(예: BOUNDING_BOX 또는 GRID)을 변경하려면 DROP_EXISTING = ON을 지정하는 CREATE SPATIAL INDEX 문을 사용하거나 해당 공간 인덱스를 삭제하고 새로 만들 수 있습니다.To change options that are specific to a spatial index, such as BOUNDING_BOX or GRID, you can either use a CREATE SPATIAL INDEX statement that specifies DROP_EXISTING = ON, or drop the spatial index and create a new one. 예제를 보려면 CREATE SPATIAL INDEX(Transact-SQL)의 "주의" 섹션을 참조하세요.For an example, see CREATE SPATIAL INDEX (Transact-SQL).

Data CompressionData Compression

데이터 압축에 대한 자세한 내용은 데이터 압축을 참조하세요.For a more information about data compression, see Data Compression.

페이지(PAGE) 및 행(ROW) 압축을 변경할 경우 테이블, 인덱스 또는 파티션에 어떤 영향을 주는지 확인하려면 sp_estimate_data_compression_savings 저장 프로시저를 사용합니다.To evaluate how changing PAGE and ROW compression will affect a table, an index, or a partition, use the sp_estimate_data_compression_savings stored procedure.

다음은 분할된 인덱스에 적용되는 제한 사항입니다.The following restrictions apply to partitioned indexes:

  • ALTER INDEX ALL ...을 사용할 때 테이블에 정렬되지 않은 인덱스가 있으면 단일 파티션의 압축 설정을 변경할 수 없습니다.When you use ALTER INDEX ALL ..., you cannot change the compression setting of a single partition if the table has nonaligned indexes.
  • ALTER INDEX <index> ... REBUILD PARTITION ... 구문은 인덱스의 지정된 파티션을 다시 빌드합니다.The ALTER INDEX <index> ... REBUILD PARTITION ... syntax rebuilds the specified partition of the index.
  • ALTER INDEX <index> ... REBUILD WITH ... 구문은 인덱스의 모든 파티션을 다시 빌드합니다.The ALTER INDEX <index> ... REBUILD WITH ... syntax rebuilds all partitions of the index.

통계Statistics

테이블에서 ALTER INDEX ALL ... 을 실행하면 인덱스와 연결된 통계만 업데이트됩니다.When you execute ALTER INDEX ALL ... on a table, only the statistics associates with indexes are updated. 인덱스 대신 테이블에 대해 만들어진 자동 또는 수동 통계는 업데이트되지 않습니다.Automatic or manual statistics created on the table (instead of an index) are not updated.

사용 권한Permissions

ALTER INDEX를 실행하려면 최소한 테이블이나 뷰에 대한 ALTER 권한이 필요합니다.To execute ALTER INDEX, at a minimum, ALTER permission on the table or view is required.

버전 참고 사항Version Notes

  • SQL DatabaseSQL Database는 파일 그룹 및 파일 스트림 옵션을 사용하지 않습니다.does not use filegroup and filestream options.
  • columnstore 인덱스는 SQL Server 2012(11.x)SQL Server 2012 (11.x) 이전에 사용할 수 없습니다.Columnstore indexes are not available prior to SQL Server 2012(11.x)SQL Server 2012 (11.x).
  • 다시 시작 가능한 인덱스 작업은 SQL Server 2017(14.x)SQL Server 2017 (14.x) Azure SQL DatabaseAzure SQL Database부터 사용할 수 있습니다.Resumable index operations are available Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x) Azure SQL DatabaseAzure SQL Database

기본 구문 예제:Basic syntax example:

ALTER INDEX index1 ON table1 REBUILD;  
  
ALTER INDEX ALL ON table1 REBUILD;  
  
ALTER INDEX ALL ON dbo.table1 REBUILD;  

예제: Columnstore 인덱스Examples: Columnstore Indexes

이 예제는 columnstore 인덱스에는 적용되지 않습니다.These examples apply to columnstore indexes.

A.A. REORGANIZE 데모REORGANIZE demo

이 예제에서는 ALTER INDEX REORGANIZE 명령의 작동 원리를 보여줍니다.This example demonstrates how the ALTER INDEX REORGANIZE command works. 복수의 rowgroup이 있는 테이블을 만든 다음, REORGANIZE가 rowgroup을 병합하는 방법을 보여줍니다.It creates a table that has multiple rowgroups, and then demonstrates how REORGANIZE merges the rowgroups.

-- Create a database   
CREATE DATABASE [ columnstore ];  
GO  
  
-- Create a rowstore staging table  
CREATE TABLE [ staging ] (  
     AccountKey              int NOT NULL,  
     AccountDescription      nvarchar (50),  
     AccountType             nvarchar(50),  
     AccountCodeAlternateKey     int  
     )  
  
-- Insert 10 million rows into the staging table.   
DECLARE @loop int  
DECLARE @AccountDescription varchar(50)  
DECLARE @AccountKey int  
DECLARE @AccountType varchar(50)  
DECLARE @AccountCode int  
  
SELECT @loop = 0  
BEGIN TRAN  
    WHILE (@loop < 300000)   
      BEGIN  
        SELECT @AccountKey = CAST (RAND()*10000000 as int);  
        SELECT @AccountDescription = 'accountdesc ' + CONVERT(varchar(20), @AccountKey);  
        SELECT @AccountType = 'AccountType ' + CONVERT(varchar(20), @AccountKey);  
        SELECT @AccountCode =  CAST (RAND()*10000000 as int);  
  
        INSERT INTO  staging VALUES (@AccountKey, @AccountDescription, @AccountType, @AccountCode);  
  
        SELECT @loop = @loop + 1;  
    END  
COMMIT  
  
-- Create a table for the clustered columnstore index  
  
CREATE TABLE cci_target (  
     AccountKey              int NOT NULL,  
     AccountDescription      nvarchar (50),  
     AccountType             nvarchar(50),  
     AccountCodeAlternateKey int  
     )  
  
-- Convert the table to a clustered columnstore index named inxcci_cci_target;  
CREATE CLUSTERED COLUMNSTORE INDEX idxcci_cci_target ON cci_target;  

TABLOCK 옵션을 사용하여 행을 병렬로 삽입합니다.Use the TABLOCK option to insert rows in parallel. SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 INSERT INTO 작업은 TABLOCK이 사용되는 경우 병렬로 실행할 수 있습니다.Starting with SQL Server 2016(13.x)SQL Server 2016 (13.x), the INSERT INTO operation can run in parallel when TABLOCK is used.

INSERT INTO cci_target WITH (TABLOCK) 
SELECT TOP 300000 * FROM staging;  

OPEN 델타 rowgroup을 보려면 이 명령을 실행합니다.Run this command to see the OPEN delta rowgroups. rowgroup 수는 병렬 처리 수준에 따라 달라집니다.The number of rowgroups depends on the degree of parallelism.

SELECT *   
FROM sys.dm_db_column_store_row_group_physical_stats   
WHERE object_id  = object_id('cci_target');  

모든 닫힌(CLOSED) 및 열린(OPEN) rowgroup을 columnstore에 강제 적용하려면 이 명령을 실행합니다.Run this command to force all CLOSED and OPEN rowgroups into the columnstore.

ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);  

이 명령을 다시 실행하면 더 작은 rowgroup들이 압축된 rowgroup으로 병합되는 것을 확인할 수 있습니다.Run this command again and you will see that smaller rowgroups are merged into one compressed rowgroup.

ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);  

B.B. 닫힌(CLOSED) 델타 rowgroup을 columnstore으로 압축Compress CLOSED delta rowgroups into the columnstore

이 예제에서는 REORGANIZE 옵션을 사용하여 각 닫힌(CLOSED) 델타 rowgroup을 압축된 rowgroup으로 columnstore으로 압축합니다.This example uses the REORGANIZE option to compresses each CLOSED delta rowgroup into the columnstore as a compressed rowgroup. 이 작업은 필수는 아니지만 튜플 이동기가 닫힌(CLOSED) rowgroup을 충분히 빠르게 압축하지 않는 경우에 유용합니다.This is not necessary, but is useful when the tuple-mover is not compressing CLOSED rowgroups fast enough.

-- Uses AdventureWorksDW  
-- REORGANIZE all partitions  
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;  
  
-- REORGANIZE a specific partition  
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0;  

C.C. 모든 열린(OPEN) 및 닫힌(CLOSED) 델타 rowgroup을 columnstore으로 압축Compress all OPEN AND CLOSED delta rowgroups into the columnstore

적용 대상: SQL ServerSQL Server (SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2016(13.x)SQL Server 2016 (13.x)) and Azure SQL DatabaseAzure SQL Database

REORGANIZE WITH ( COMPRESS_ALL_ROW_GROUPS = ON ) 명령은 각 열린(OPEN) 및 닫힌(CLOSED) 델타 rowgroup을 압축된 rowgroup으로 columnstore로 압축합니다.The command REORGANIZE WITH ( COMPRESS_ALL_ROW_GROUPS = ON ) compresses each OPEN and CLOSED delta rowgroup into the columnstore as a compressed rowgroup. 이렇게 하면 deltastore가 비워지고 모든 행이 columnstore로 압축되도록 강제 적용합니다.This empties the deltastore and forces all rows to get compressed into the columnstore. 이러한 작업은 행을 하나 이상의 델타 행 그룹에 저장하므로 이 기능은 많은 삽입 작업을 수행한 후 특히 유용합니다.This is useful especially after performing many insert operations since these operations store the rows in one or more delta rowgroups.

REORGANIZE는 rowgroup을 결합하여 rowgroup을 행 수 <= 1,024,576까지 채웁니다.REORGANIZE combines rowgroups to fill rowgroups up to a maximum number of rows <= 1,024,576. 그러므로 모든 열린(OPEN) 및 닫힌(CLOSED) rowgroup을 압축하는 경우 몇몇 행만 포함한 압축된 rowgroup이 손실됩니다.Therefore, when you compress all OPEN and CLOSED rowgroups you won't end up with lots of compressed rowgroups that only have a few rows in them. rowgroup을 채우면서도 압축된 크기를 가능하면 줄이고 쿼리 성능을 개선하기를 원할 것입니다.You want rowgroups to be as full as possible to reduce the compressed size and improve query performance.

-- Uses AdventureWorksDW2016  
-- Move all OPEN and CLOSED delta rowgroups into the columnstore.  
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);  
  
-- For a specific partition, move all OPEN AND CLOSED delta rowgroups into the columnstore  
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0 WITH (COMPRESS_ALL_ROW_GROUPS = ON);  

D.D. 온라인에서 columnstore 인덱스를 조각 모음Defragment a columnstore index online

SQL Server 2012(11.x)SQL Server 2012 (11.x)SQL Server 2014(12.x)SQL Server 2014 (12.x)에는 적용되지 않습니다.Does not apply to: SQL Server 2012(11.x)SQL Server 2012 (11.x) and SQL Server 2014(12.x)SQL Server 2014 (12.x).

SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 REORGANIZE는 델타 rowgroup을 columnstore으로 압축하는 것 이상의 작업을 수행합니다.Starting with SQL Server 2016(13.x)SQL Server 2016 (13.x), REORGANIZE does more than compress delta rowgroups into the columnstore. 또한 온라인 조각 모음도 수행합니다.It also performs online defragmentation. 먼저, rowgroup 행 수의 10% 이상이 삭제된 경우 삭제된 행을 물리적으로 제거하여 columnstore의 크기를 줄입니다.First, it reduces the size of the columnstore by physically removing deleted rows when 10% or more of the rows in a rowgroup have been deleted. 그런 다음, rowgroup들을 함께 결합하여 rowgroup당 최대 1,024,576개의 행을 포함하는 더 큰 rowgroup을 형성합니다.Then, it combines rowgroups together to form larger rowgroups that have up to the maximum of 1,024,576 rows per rowgroups. 변경된 모든 rowgroup은 다시 압축됩니다.All rowgroups that are changed get re-compressed.

참고

SQL Server 2016(13.x)SQL Server 2016 (13.x)부터는 REORGANIZE가 삭제된 행을 물리적으로 제거하고 rowgroup을 병합하므로 columnstore 인덱스 다시 작성은 더 이상 필요하지 않습니다.Starting with SQL Server 2016(13.x)SQL Server 2016 (13.x), rebuilding a columnstore index is no longer necessary in most situations since REORGANIZE physically removes deleted rows and merges rowgroups. COMPRESS_ALL_ROW_GROUPS 옵션은 모든 열린(OPEN) 또는 닫힌(CLOSED) 델타 rowgroup을 columnstore으로 강제 적용하며, 이전에 이 기능은 다시 작성으로만 수행할 수 있었습니다.The COMPRESS_ALL_ROW_GROUPS option forces all OPEN or CLOSED delta rowgroups into the columnstore which previously could only be done with a rebuild. REORGANIZE는 온라인으로 배경에서 수행되므로 쿼리는 작업이 이루어지는 동안 계속할 수 있습니다.REORGANIZE is online and occurs in the background so queries can continue as the operation happens.

-- Uses AdventureWorks  
-- Defragment by physically removing rows that have been logically deleted from the table, and merging rowgroups.  
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;  

E.E. 오프라인으로 클러스터형 columnstore 인덱스 다시 작성Rebuild a clustered columnstore index offline

적용 대상: SQL ServerSQL Server (SQL Server 2012(11.x)SQL Server 2012 (11.x)부터 시작)Applies to: SQL ServerSQL Server (Starting with SQL Server 2012(11.x)SQL Server 2012 (11.x))

SQL Server 2016(13.x)SQL Server 2016 (13.x)에서, 그리고 Azure SQL DatabaseAzure SQL Database부터 ALTER INDEX REBUILD 대신에 ALTER INDEX REORGANIZE를 사용할 것을 권장합니다.Starting with SQL Server 2016(13.x)SQL Server 2016 (13.x) and in Azure SQL DatabaseAzure SQL Database, we recommend using ALTER INDEX REORGANIZE instead of ALTER INDEX REBUILD.

참고

SQL Server 2012(11.x)SQL Server 2012 (11.x)SQL Server 2014(12.x)SQL Server 2014 (12.x)에서 REORGANIZE는 닫힌(CLOSED) rowgroup을 columnstore으로 압축하기 위해서만 사용됩니다.In SQL Server 2012(11.x)SQL Server 2012 (11.x) and SQL Server 2014(12.x)SQL Server 2014 (12.x), REORGANIZE is only used to compress CLOSED rowgroups into the columnstore. 조각 모음 작업을 수행하고 모든 델타 rowgroup을 columnstore으로 강제 적용하는 유일한 방법은 인덱스를 다시 작성하는 것뿐입니다.The only way to perform defragmentation operations and to force all delta rowgroups into the columnstore is to rebuild the index.

이 예제에서는 클러스터형 columnstore 인덱스를 다시 작성하고 모든 델타 rowgroup을 columnstore으로 강제 적용하는 방법을 보여줍니다.This example shows how to rebuild a clustered columnstore index and force all delta rowgroups into the columnstore. 첫 단계에서는 클러스터형 columnstore 인덱스가 있는 FactInternetSales2 테이블을 준비하고 첫 번째 네 열에서 데이터를 삽입합니다.This first step prepares a table FactInternetSales2 with a clustered columnstore index and inserts data from the first four columns.

-- Uses AdventureWorksDW  
  
CREATE TABLE dbo.FactInternetSales2 (  
    ProductKey [int] NOT NULL,   
    OrderDateKey [int] NOT NULL,   
    DueDateKey [int] NOT NULL,   
    ShipDateKey [int] NOT NULL);  
  
CREATE CLUSTERED COLUMNSTORE INDEX cci_FactInternetSales2  
ON dbo.FactInternetSales2;  
  
INSERT INTO dbo.FactInternetSales2  
SELECT ProductKey, OrderDateKey, DueDateKey, ShipDateKey  
FROM dbo.FactInternetSales;  
  
SELECT * FROM sys.column_store_row_groups;  

결과는 열린(OPEN) rowgroup이 하나임을 보여 주며, 이는 SQL ServerSQL Server에서 rowgroup을 닫고 데이터를 columnstore로 이동하기 전에 여러 행이 추가되도록 대기한다는 것을 의미합니다.The results show there is one OPEN rowgroup, which means SQL ServerSQL Server will wait for more rows to be added before it closes the rowgroup and moves the data to the columnstore. 다음 명령문은 모든 행을 columnstore로 강제 적용하는 클러스터형 columnstore 인덱스를 다시 작성합니다.This next statement rebuilds the clustered columnstore index, which forces all rows into the columnstore.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REBUILD;  
SELECT * FROM sys.column_store_row_groups;  

SELECT 문 결과는 행 그룹이 COMPRESSED임을 보여 주며 행 그룹의 열 세그먼트가 이제 압축되고 columnstore에 저장됨을 의미합니다.The results of the SELECT statement show the rowgroup is COMPRESSED, which means the column segments of the rowgroup are now compressed and stored in the columnstore.

F.F. 오프라인으로 클러스터형 columnstore의 파티션 다시 작성Rebuild a partition of a clustered columnstore index offline

적용 대상: SQL ServerSQL Server (SQL Server 2012(11.x)SQL Server 2012 (11.x)부터 시작)Applies to: SQL ServerSQL Server (Starting with SQL Server 2012(11.x)SQL Server 2012 (11.x))

대규모 클러스터형 columnstore 인덱스의 파티션을 다시 작성하려면 파티션 옵션과 함께 ALTER INDEX REBUILD를 사용합니다.To rebuild a partition of a large clustered columnstore index, use ALTER INDEX REBUILD with the partition option. 이 예제에서는 파티션 12를 다시 작성합니다.This example rebuilds partition 12. SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 REBUILD를 REORGANIZE로 대체할 것을 권장합니다.Starting with SQL Server 2016(13.x)SQL Server 2016 (13.x), we recommend replacing REBUILD with REORGANIZE.

ALTER INDEX cci_fact3   
ON fact3  
REBUILD PARTITION = 12;  

G.G. 클러스터형 columstore를 보관 압축을 사용하도록 변경Change a clustered columstore index to use archival compression

SQL Server 2012(11.x)SQL Server 2012 (11.x)에는 적용되지 않습니다.Does not apply to: SQL Server 2012(11.x)SQL Server 2012 (11.x)

COLUMNSTORE_ARCHIVE 데이터 압축 옵션을 사용하여 클러스터형 columstore 인덱스의 크기를 훨씬 더 줄이는 방법을 선택할 수 있습니다.You can choose to reduce the size of a clustered columnstore index even further by using the COLUMNSTORE_ARCHIVE data compression option. 이 방법은 저렴한 스토리지에 보관하려는 오래된 데이터에 실용적입니다.This is practical for older data that you want to keep on cheaper storage. 일반적인 COLUMNSTORE 압축을 사용하면 압축 해제가 더 느려지므로 자주 액세스하지 않는 데이터에 대해서만 이 방법을 사용하는 것이 좋습니다.We recommend only using this on data that is not accessed often since decompress is slower than with the normal COLUMNSTORE compression.

다음 예에서는 보관 압축을 사용하기 위해 클러스터형 columnstore 인덱스를 다시 작성한 다음 보관 압축을 제거하는 방법을 보여 줍니다.The following example rebuilds a clustered columnstore index to use archival compression, and then shows how to remove the archival compression. 마지막 결과에서는 columnstore 압축만 사용합니다.The final result will use only columnstore compression.

--Prepare the example by creating a table with a clustered columnstore index.  
CREATE TABLE SimpleTable (  
    ProductKey [int] NOT NULL,   
    OrderDateKey [int] NOT NULL,   
    DueDateKey [int] NOT NULL,   
    ShipDateKey [int] NOT NULL  
);  
  
CREATE CLUSTERED INDEX cci_SimpleTable ON SimpleTable (ProductKey);  
  
CREATE CLUSTERED COLUMNSTORE INDEX cci_SimpleTable  
ON SimpleTable  
WITH (DROP_EXISTING = ON);  
  
--Compress the table further by using archival compression.  
ALTER INDEX cci_SimpleTable ON SimpleTable  
REBUILD  
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);  
  
--Remove the archive compression and only use columnstore compression.  
ALTER INDEX cci_SimpleTable ON SimpleTable  
REBUILD  
WITH (DATA_COMPRESSION = COLUMNSTORE);  
GO  

예제: Rowstore 인덱스Examples: Rowstore indexes

A.A. 인덱스 다시 작성Rebuilding an index

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스에 있는 Employee 테이블의 단일 인덱스를 다시 작성합니다.The following example rebuilds a single index on the Employee table in the AdventureWorks2012AdventureWorks2012 database.

ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee REBUILD;  

B.B. 테이블의 모든 인덱스 다시 작성 및 옵션 지정Rebuilding all indexes on a table and specifying options

다음 예에서는 ALL 키워드를 지정합니다.The following example specifies the keyword ALL. 그러면 AdventureWorks2012AdventureWorks2012 데이터베이스의 Production.Product 테이블과 연결된 모든 인덱스를 다시 작성합니다.This rebuilds all indexes associated with the table Production.Product in the AdventureWorks2012AdventureWorks2012 database. 3개의 옵션이 지정됩니다.Three options are specified.

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

ALTER INDEX ALL ON Production.Product  
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);  

다음 예에서는 낮은 우선 순위 잠금 옵션을 포함하여 ONLINE 옵션을 추가하고 행 압축 옵션을 추가합니다.The following example adds the ONLINE option including the low priority lock option, and adds the row compression option.

적용 대상: SQL ServerSQL Server (SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2014(12.x)SQL Server 2014 (12.x)) and Azure SQL DatabaseAzure SQL Database

ALTER INDEX ALL ON Production.Product  
REBUILD WITH   
(  
    FILLFACTOR = 80,   
    SORT_IN_TEMPDB = ON,  
    STATISTICS_NORECOMPUTE = ON,  
    ONLINE = ON ( WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 4 MINUTES, ABORT_AFTER_WAIT = BLOCKERS ) ),   
    DATA_COMPRESSION = ROW  
);  

C.C. 인덱스 다시 구성과 LOB 압축Reorganizing an index with LOB compaction

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스의 단일 클러스터형 인덱스를 다시 구성합니다.The following example reorganizes a single clustered index in the AdventureWorks2012AdventureWorks2012 database. 인덱스에 리프 수준의 LOB 데이터 형식이 포함되어 있으므로 해당 문은 큰 개체 데이터가 포함된 페이지도 모두 압축합니다.Because the index contains a LOB data type in the leaf level, the statement also compacts all pages that contain the large object data. 기본값이 ON이므로 WITH(LOB_COMPACTION = ON) 옵션은 지정하지 않아도 됩니다.Note that specifying the WITH (LOB_COMPACTION = ON) option is not required because the default value is ON.

ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto REORGANIZE WITH (LOB_COMPACTION = ON);  

D.D. 인덱스에 옵션 설정Setting options on an index

다음 예에서는 AK_SalesOrderHeader_SalesOrderNumber 데이터베이스의 AdventureWorks2012AdventureWorks2012 인덱스에 몇 가지 옵션을 설정합니다.The following example sets several options on the index AK_SalesOrderHeader_SalesOrderNumber in the AdventureWorks2012AdventureWorks2012 database.

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2008SQL Server 2008) and Azure SQL DatabaseAzure SQL Database

ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber ON  
    Sales.SalesOrderHeader  
SET (  
    STATISTICS_NORECOMPUTE = ON,  
    IGNORE_DUP_KEY = ON,  
    ALLOW_PAGE_LOCKS = ON  
    ) ;  
GO

E.E. 인덱스 비활성화Disabling an index

다음 예에서는 Employee 데이터베이스에 있는 AdventureWorks2012AdventureWorks2012 테이블의 비클러스터형 인덱스를 비활성화합니다.The following example disables a nonclustered index on the Employee table in the AdventureWorks2012AdventureWorks2012 database.

ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee DISABLE;

F.F. 제약 조건 비활성화Disabling constraints

다음 예제에서는 AdventureWorks2012AdventureWorks2012 데이터베이스에 있는 PRIMARY KEY 인덱스를 비활성화하여 PRIMARY KEY 제약 조건을 비활성화합니다.The following example disables a PRIMARY KEY constraint by disabling the PRIMARY KEY index in the AdventureWorks2012AdventureWorks2012 database. 기본 테이블에 대한 FOREIGN KEY 제약 조건이 자동으로 비활성화되고 경고 메시지가 표시됩니다.The FOREIGN KEY constraint on the underlying table is automatically disabled and warning message is displayed.

ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department DISABLE;  

결과 집합에서 다음과 같은 경고 메시지를 반환합니다.The result set returns this warning message.

Warning: Foreign key 'FK_EmployeeDepartmentHistory_Department_DepartmentID'  
on table 'EmployeeDepartmentHistory' referencing table 'Department'  
was disabled as a result of disabling the index 'PK_Department_DepartmentID'.

G.G. 제약 조건 활성화Enabling constraints

다음 예에서는 6번 예에서 비활성화된 PRIMARY KEY와 FOREIGN KEY 제약 조건을 활성화합니다.The following example enables the PRIMARY KEY and FOREIGN KEY constraints that were disabled in Example F.

PRIMARY KEY 인덱스를 다시 작성하여 PRIMARY KEY 제약 조건이 활성화됩니다.The PRIMARY KEY constraint is enabled by rebuilding the PRIMARY KEY index.

ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department REBUILD;  

그런 다음 FOREIGN KEY 제약 조건이 활성화됩니다.The FOREIGN KEY constraint is then enabled.

ALTER TABLE HumanResources.EmployeeDepartmentHistory  
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;  
GO  

H.H. 분할된 인덱스 다시 작성Rebuilding a partitioned index

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스에 있는 분할된 인덱스 5의 단일 파티션인 파티션 번호 IX_TransactionHistory_TransactionDate를 다시 작성합니다.The following example rebuilds a single partition, partition number 5, of the partitioned index IX_TransactionHistory_TransactionDate in the AdventureWorks2012AdventureWorks2012 database. 파티션 5가 온라인으로 다시 작성되고 낮은 우선 순위 잠금에 대한 10분 대기 시간이 인덱스 다시 작성 작업으로 획득된 모든 잠금에 개별적으로 적용됩니다.Partition 5 is rebuilt online and the 10 minutes wait time for the low priority lock applies separately to every lock acquired by index rebuild operation. 이 시간 동안에는 인덱스 다시 작성을 완료하기 위한 잠금을 획득할 수 없으며, 다시 작성 작업 문이 중단됩니다.If during this time the lock cannot be obtained to complete index rebuild, the rebuild operation statement is aborted.

적용 대상: SQL ServerSQL Server (SQL Server 2014(12.x)SQL Server 2014 (12.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2014(12.x)SQL Server 2014 (12.x)) and Azure SQL DatabaseAzure SQL Database

-- Verify the partitioned indexes.  
SELECT *  
FROM sys.dm_db_index_physical_stats (DB_ID(),OBJECT_ID(N'Production.TransactionHistory'), NULL , NULL, NULL);  
GO  
--Rebuild only partition 5.  
ALTER INDEX IX_TransactionHistory_TransactionDate  
ON Production.TransactionHistory  
REBUILD Partition = 5   
   WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 10 minutes, ABORT_AFTER_WAIT = SELF)));  
GO  

9.I. 인덱스의 압축 설정 변경Changing the compression setting of an index

다음 예에서는 분할되지 않은 rowstore 테이블에 인덱스를 다시 작성합니다.The following example rebuilds an index on a nonpartitioned rowstore table.

ALTER INDEX IX_INDEX1   
ON T1  
REBUILD   
WITH (DATA_COMPRESSION = PAGE);  
GO  

데이터 압축 예제를 더 보려면 데이터 압축을 참조하세요.For additional data compression examples, see Data Compression.

J.J. 온라인으로 다시 시작 가능한 인덱스 다시 작성Online resumable index rebuild

적용 대상: SQL ServerSQL Server (SQL Server 2017(14.x)SQL Server 2017 (14.x)부터 시작) 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL ServerSQL Server (Starting with SQL Server 2017(14.x)SQL Server 2017 (14.x)) and Azure SQL DatabaseAzure SQL Database

다음 예제에서는 온라인 다시 시작 가능한 인덱스 다시 작성을 사용하는 방법을 보여줍니다.The following examples show how to use online resumable index rebuild.

  1. MAXDOP=1로 설정하고 온라인 인덱스 다시 작성을 다시 시작 가능한 작업으로 실행합니다.Execute an online index rebuild as resumable operation with MAXDOP=1.

    ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE=ON, MAXDOP=1, RESUMABLE=ON) ;
    
  2. 인덱스 작업이 일시 중지된 후 같은 명령을 다시 실행하면(위 참조) 인덱스 다시 작성 작업이 자동으로 다시 시작됩니다.Executing the same command again (see above) after an index operation was paused, resumes automatically the index rebuild operation.

  3. MAX_DURATION을 240분으로 설정하여 온라인 인덱스 다시 작성을 다시 시작 가능한 작업으로 실행합니다.Execute an online index rebuild as resumable operation with MAX_DURATION set to 240 minutes.

    ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE=ON, RESUMABLE=ON, MAX_DURATION=240) ; 
    
  4. 실행 중인 다시 시작 가능한 온라인 인덱스 다시 작성을 일시 중지합니다.Pause a running resumable online index rebuild.

    ALTER INDEX test_idx on test_table PAUSE ;
    
  5. MAXDOP에 대한 새 값을 4로 지정하여 다시 시작 가능한 작업으로 실행된 인덱스 다시 작성에 대해 온라인 인덱스 다시 작성을 다시 시작합니다.Resume an online index rebuild for an index rebuild that was executed as resumable operation specifying a new value for MAXDOP set to 4.

    ALTER INDEX test_idx on test_table RESUME WITH (MAXDOP=4) ;
    
  6. 다시 시작 가능한 것으로 실행된 인덱스 온라인 다시 작성에 대해 온라인 인덱스 다시 작성 작업을 다시 시작합니다.Resume an online index rebuild operation for an index online rebuild that was executed as resumable. MAXDOP를 2로 설정하고, 다시 시작 가능한 것으로 실행 중인 인덱스의 실행 시간을 240분으로 실행하며, 잠금에 대해 차단된 인덱스의 경우 10분 대기하고 그 후에는 모든 차단기를 종료합니다.Set MAXDOP to 2, set the execution time for the index being running as resumable to 240 minutes and in case of an index being blocked on the lock wait 10 minutes and after that kill all blockers.

       ALTER INDEX test_idx on test_table  
          RESUME WITH (MAXDOP=2, MAX_DURATION= 240 MINUTES, 
          WAIT_AT_LOW_PRIORITY (MAX_DURATION=10, ABORT_AFTER_WAIT=BLOCKERS)) ;
    
  7. 실행 중이거나 일시 중지된 다시 시작 가능한 인덱스 다시 작성 작업을 중단합니다.Abort resumable index rebuild operation which is running or paused.

    ALTER INDEX test_idx on test_table ABORT ;
    

참고 항목See Also

SQL Server 인덱스 아키텍처 및 디자인 가이드 SQL Server Index Architecture and Design Guide
온라인으로 인덱스 작업 수행 Perform Index Operations Online
CREATE INDEX(Transact-SQL) CREATE INDEX (Transact-SQL)
CREATE SPATIAL INDEX (Transact-SQL) CREATE SPATIAL INDEX (Transact-SQL)
CREATE XML INDEX (Transact-SQL) CREATE XML INDEX (Transact-SQL)
DROP INDEX (Transact-SQL) DROP INDEX (Transact-SQL)
인덱스 및 제약 조건 비활성화 Disable Indexes and Constraints
XML 인덱스(SQL Server) XML Indexes (SQL Server)
인덱스 다시 구성 및 다시 작성 Reorganize and Rebuild Indexes
sys.dm_db_index_physical_stats(Transact-SQL) sys.dm_db_index_physical_stats (Transact-SQL)
EVENTDATA(Transact-SQL)EVENTDATA (Transact-SQL)