CREATE INDEX(Transact-SQL)CREATE INDEX (Transact-SQL)

이 항목은 다음에 적용됩니다. 예SQL Server(2008부터)예Azure SQL Database예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

테이블 또는 뷰에 관계 인덱스를 만듭니다.Creates a relational index on a table or view. 이 인덱스는 클러스터형 또는 비클러스터형 B-트리 인덱스이므로 rowstore 인덱스라고도 합니다.Also called a rowstore index because it is either a clustered or nonclustered B-tree index. 테이블에 데이터가 채워지기 전에 rowstore 인덱스를 만들 수 있습니다.You can create a rowstore index before there is data in the table. 특히 쿼리가 특정 열에서 값을 선택하거나 값을 특정 순서로 정렬해야 하는 경우 rowstore 인덱스를 사용하여 쿼리 성능을 개선할 수 있습니다.Use a rowstore index to improve query performance, especially when the queries select from specific columns or require values to be sorted in a particular order.

참고

SQL 데이터 웨어하우스SQL Data Warehouse병렬 데이터 웨어하우스Parallel Data Warehouse는 현재 Unique 제약 조건을 지원하지 않습니다. and 병렬 데이터 웨어하우스Parallel Data Warehouse currently do not support Unique constraints. Unique 제약 조건을 참조하는 예제는 SQL ServerSQL ServerSQL 데이터베이스SQL Database에만 적용할 수 있습니다.Any examples referencing Unique Constraints are only applicable to SQL ServerSQL Server and SQL 데이터베이스SQL Database.

인덱스 디자인 지침에 대한 자세한 내용은 SQL Server 인덱스 디자인 가이드를 참조하세요.For information on index design guidelines, refer to the SQL Server Index Design Guide.

간단한 예제:Simple examples:

-- Create a nonclustered index on a table or view  
CREATE INDEX i1 ON t1 (col1);  
--Create a clustered index on a table and use a 3-part name for the table  
CREATE CLUSTERED INDEX i1 ON d1.s1.t1 (col1);  
-- Syntax for SQL Server and Azure SQL Database
-- Create a nonclustered index with a unique constraint 
-- on 3 columns and specify the sort order for each column  
CREATE UNIQUE INDEX i1 ON t1 (col1 DESC, col2 ASC, col3 DESC);  

주요 시나리오:Key scenarios:

  • SQL Server 2016(13.x)SQL Server 2016 (13.x)SQL 데이터베이스SQL Database부터 columnstore 인덱스에 비클러스터형 인덱스를 사용하여 데이터 웨어하우징 쿼리 성능을 개선할 수 있습니다.Starting with SQL Server 2016(13.x)SQL Server 2016 (13.x) and SQL 데이터베이스SQL Database, use a nonclustered index on a columnstore index to improve data warehousing query performance. 자세한 내용은 Columnstore 인덱스 - 데이터 웨어하우징을 참조하세요.For more information, see Columnstore Indexes - Data Warehouse.

여러 가지 유형의 인덱스를 만들어야 하나요?Need to create a different type of index?

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

구문Syntax

SQL Server 및 Azure SQL Database에 대한 구문Syntax for SQL Server and Azure SQL Database

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name   
    ON <object> ( column [ ASC | DESC ] [ ,...n ] )   
    [ INCLUDE ( column_name [ ,...n ] ) ]  
    [ WHERE <filter_predicate> ]  
    [ WITH ( <relational_index_option> [ ,...n ] ) ]  
    [ ON { partition_scheme_name ( column_name )   
         | filegroup_name   
         | default   
         }  
    ]  
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]  

[ ; ]  

<object> ::=  
{  
    [ database_name. [ schema_name ] . | schema_name. ]   
    table_or_view_name  
}  

<relational_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 }  
  | DROP_EXISTING = { ON | OFF }  
  | ONLINE = { ON | OFF }  
  | ALLOW_ROW_LOCKS = { ON | OFF }  
  | ALLOW_PAGE_LOCKS = { ON | OFF }  
  | MAXDOP = max_degree_of_parallelism  
  | DATA_COMPRESSION = { NONE | ROW | PAGE}   
     [ ON PARTITIONS ( { <partition_number_expression> | <range> }   
     [ , ...n ] ) ]  
}  

<filter_predicate> ::=   
    <conjunct> [ AND <conjunct> ]  

<conjunct> ::=  
    <disjunct> | <comparison>  

<disjunct> ::=  
        column_name IN (constant ,...n)  

<comparison> ::=  
        column_name <comparison_op> constant  

<comparison_op> ::=  
    { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }  

<range> ::=   
<partition_number_expression> TO <partition_number_expression>  

이전 버전과 호환되는 관계형 인덱스Backward Compatible Relational Index

중요

이전 버전과 호환되는 관계형 인덱스 구문 구조는 나중 버전의 SQL ServerSQL Server에서 제거됩니다.The backward compatible relational index syntax structure will be removed in a future version of SQL ServerSQL Server. 새 개발 작업에서는 이 구문 구조를 사용하지 않도록 하고 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오.Avoid using this syntax structure in new development work, and plan to modify applications that currently use the feature. 대신 <relational_index_option>에서 지정된 구문 구조를 사용합니다.Use the syntax structure specified in <relational_index_option> instead.

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name   
    ON <object> ( column_name [ ASC | DESC ] [ ,...n ] )   
    [ WITH <backward_compatible_index_option> [ ,...n ] ]  
    [ ON { filegroup_name | "default" } ]  

<object> ::=  
{  
    [ database_name. [ owner_name ] . | owner_name. ]   
    table_or_view_name  
}  

<backward_compatible_index_option> ::=  
{   
    PAD_INDEX  
  | FILLFACTOR = fillfactor  
  | SORT_IN_TEMPDB  
  | IGNORE_DUP_KEY  
  | STATISTICS_NORECOMPUTE   
  | DROP_EXISTING   
}  

Azure SQL Data Warehouse 및 병렬 데이터 웨어하우스용 구문Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse


CREATE [ CLUSTERED | NONCLUSTERED ] INDEX index_name   
    ON [ database_name . [ schema ] . | schema . ] table_name   
        ( { column [ ASC | DESC ] } [ ,...n ] )  
    WITH ( DROP_EXISTING = { ON | OFF } )  
[;]  

인수Arguments

UNIQUEUNIQUE
테이블 또는 뷰에 고유 인덱스를 만듭니다.Creates a unique index on a table or view. 고유 인덱스는 두 개의 행에 동일한 인덱스 키 값을 가질 수 없습니다.A unique index is one in which no two rows are permitted to have the same index key value. 뷰의 클러스터형 인덱스는 고유해야 합니다.A clustered index on a view must be unique.

IGNORE_DUP_KEY가 ON으로 설정되어 있는지 여부에 관계없이 데이터베이스 엔진Database Engine에서는 이미 중복 값이 들어 있는 열에 고유 인덱스를 만들 수 없습니다.The 데이터베이스 엔진Database Engine does not allow creating a unique index on columns that already include duplicate values, whether or not IGNORE_DUP_KEY is set to ON. 이 작업을 시도하면 데이터베이스 엔진Database Engine은 오류 메시지를 표시합니다.If this is tried, the 데이터베이스 엔진Database Engine displays an error message. 열에 고유 인덱스를 만들려면 먼저 중복 값을 제거해야 합니다.Duplicate values must be removed before a unique index can be created on the column or columns. 고유 인덱스를 만들 때 여러 개의 Null 값은 중복 값으로 취급되므로 고유 인덱스에서 사용되는 열은 NOT NULL로 설정해야 합니다.Columns that are used in a unique index should be set to NOT NULL, because multiple null values are considered duplicates when a unique index is created.

CLUSTEREDCLUSTERED
키 값의 논리적 순서가 테이블에 있는 해당 행의 물리적 순서를 결정하는 인덱스를 만듭니다.Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table. 클러스터형 인덱스의 최하위 수준인 리프 수준에는 테이블의 실제 데이터 행이 있습니다.The bottom, or leaf, level of the clustered index contains the actual data rows of the table. 테이블 또는 뷰는 한 번에 클러스터형 인덱스 하나만 허용합니다.A table or view is allowed one clustered index at a time.

고유 클러스터형 인덱스가 있는 뷰를 인덱싱된 뷰라고 합니다.A view with a unique clustered index is called an indexed view. 뷰에서 고유 클러스터형 인덱스를 만들면 물리적으로 뷰를 구체화합니다.Creating a unique clustered index on a view physically materializes the view. 같은 뷰에 다른 인덱스를 정의하려면 먼저 고유 클러스터형 인덱스를 만들어야 합니다.A unique clustered index must be created on a view before any other indexes can be defined on the same view. 자세한 내용은 인덱싱된 뷰 만들기를 참조하세요.For more information, see Create Indexed Views.

비클러스터형 인덱스를 만들기 전에 항상 클러스터형 인덱스를 만듭니다.Create the clustered index before creating any nonclustered indexes. 테이블에 있는 기존의 비클러스터형 인덱스는 클러스터형 인덱스를 만들 때 다시 작성됩니다.Existing nonclustered indexes on tables are rebuilt when a clustered index is created.

CLUSTERED를 지정하지 않으면 비클러스터형 인덱스가 만들어집니다.If CLUSTERED is not specified, a nonclustered index is created.

참고

클러스터형 인덱스의 리프 수준과 데이터 페이지는 정의에 의해 동일하므로, 클러스터형 인덱스를 만들고 ON partition_scheme_name 또는 ON filegroup_name 절을 사용하면 결과적으로 테이블을 만든 파일 그룹의 테이블이 새 파티션 구성표 또는 파일 그룹으로 이동하게 됩니다.Because the leaf level of a clustered index and the data pages are the same by definition, creating a clustered index and using the ON partition_scheme_name or ON filegroup_name clause effectively moves a table from the filegroup on which the table was created to the new partition scheme or filegroup. 특정 파일 그룹에서 테이블이나 인덱스를 만들기 전에 사용 가능한 파일 그룹과 인덱스를 만들 공간이 충분한지 확인합니다.Before creating tables or indexes on specific filegroups, verify which filegroups are available and that they have enough empty space for the index.

일부 경우 클러스터형 인덱스를 만들면 이전에 비활성화된 인덱스를 사용할 수 있습니다.In some cases creating a clustered index can enable previously disabled indexes. 자세한 내용은 인덱스 및 제약 조건 활성화인덱스 및 제약 조건 비활성화를 참조하세요.For more information, see Enable Indexes and Constraints and Disable Indexes and Constraints.

NONCLUSTEREDNONCLUSTERED
테이블의 논리적 순서를 지정하는 인덱스를 만듭니다.Creates an index that specifies the logical ordering of a table. 비클러스터형 인덱스에서는 데이터 행의 물리적 순서가 인덱싱된 순서와 다릅니다.With a nonclustered index, the physical order of the data rows is independent of their indexed order.

각 테이블에는 비클러스터형 인덱스를 PRIMARY KEY와 UNIQUE 제약 조건을 사용하여 암시적으로 만들거나 CREATE INDEX를 사용하여 명시적으로 만드는 방법에 관계없이 999개까지 만들 수 있습니다.Each table can have up to 999 nonclustered indexes, regardless of how the indexes are created: either implicitly with PRIMARY KEY and UNIQUE constraints, or explicitly with CREATE INDEX.

인덱싱된 뷰의 경우 비클러스터형 인덱스는 이미 고유 클러스터형 인덱스가 정의되어 있는 뷰에서만 만들 수 있습니다.For indexed views, nonclustered indexes can be created only on a view that has a unique clustered index already defined.

달리 지정하지 않으면 기본 인덱스 유형은 NONCLUSTERED입니다.If not otherwise specified, the default index type is NONCLUSTERED.

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.

columncolumn
인덱스의 기준이 되는 열입니다.Is the column or columns on which the index is based. 지정된 열에 있는 결합된 값에 복합 인덱스를 만들려면 두 개 이상의 열 이름을 지정합니다.Specify two or more column names to create a composite index on the combined values in the specified columns. 복합 인덱스에 포함할 열을 table_or_view_name 다음의 괄호 안에 정렬 우선 순위 순서대로 나열합니다.List the columns to be included in the composite index, in sort-priority order, inside the parentheses after table_or_view_name.

단일 복합 인덱스 키에 최대 32개의 열을 결합할 수 있으며Up to 32 columns can be combined into a single composite index key. 복합 인덱스 키의 모든 열은 동일한 테이블 또는 뷰에 있어야 합니다.All the columns in a composite index key must be in the same table or view. 결합된 인덱스 값의 최대 허용 크기는 클러스터형 인덱스의 경우 900바이트, 비클러스터형 인덱스의 경우 1,700바이트입니다.The maximum allowable size of the combined index values is 900 bytes for a clustered index, or 1,700 for a nonclustered index. 한도는 SQL 데이터베이스SQL Database V12 및 SQL Server 2016(13.x)SQL Server 2016 (13.x) 이전 버전의 경우 16열 및 900바이트입니다.The limits are 16 columns and 900 bytes for versions before SQL 데이터베이스SQL Database V12 and SQL Server 2016(13.x)SQL Server 2016 (13.x).

큰 개체(LOB) 데이터 형식 ntext, text, varchar(max), nvarchar(max), varbinary(max), xml 또는 image인 열은 인덱스의 키 열로 지정할 수 없습니다.Columns that are of the large object (LOB) data types ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, or image cannot be specified as key columns for an index. 또한 CREATE INDEX 문에 참조되지 않은 경우에도 뷰 정의에 ntext, text 또는 image 열을 포함할 수 없습니다.Also, a view definition cannot include ntext, text, or image columns, even if they are not referenced in the CREATE INDEX statement.

이진 순서를 지원하는 CLR 사용자 정의 형식 열에 인덱스를 만들 수 있습니다.You can create indexes on CLR user-defined type columns if the type supports binary ordering. 메서드가 결정적으로 표시되고 데이터 액세스 작업을 수행하지 않는 동안 사용자 정의 형식 열의 메서드 호출로 정의된 계산 열에 인덱스를 만들 수도 있습니다.You can also create indexes on computed columns that are defined as method invocations off a user-defined type column, as long as the methods are marked deterministic and do not perform data access operations. CLR 사용자 정의 형식 열을 인덱싱하는 방법은 CLR 사용자 정의 형식을 참조하세요.For more information about indexing CLR user-defined type columns, see CLR User-defined Types.

[ ASC | DESC ][ ASC | DESC ]
특정 인덱스 열의 정렬 방향을 오름차순 또는 내림차순으로 지정합니다.Determines the ascending or descending sort direction for the particular index column. 기본값은 ASC입니다.The default is ASC.

INCLUDE (column [ ,... n ] )INCLUDE (column [ ,... n ] )
비클러스터형 인덱스의 리프 수준에 키가 아닌 열을 추가하도록 지정합니다.Specifies the non-key columns to be added to the leaf level of the nonclustered index. 비클러스터형 인덱스는 고유하거나 고유하지 않을 수 있습니다.The nonclustered index can be unique or non-unique.

열 이름을 INCLUDE 목록에 반복 사용할 수 없으며 키 열과 키가 아닌 열로 동시에 사용할 수 없습니다.Column names cannot be repeated in the INCLUDE list and cannot be used simultaneously as both key and non-key columns. 클러스터형 인덱스가 테이블에 정의되어 있으면 비클러스터형 인덱스는 항상 클러스터형 인덱스 열을 포함합니다.Nonclustered indexes always contain the clustered index columns if a clustered index is defined on the table. 자세한 내용은 Create Indexes with Included Columns을 참조하세요.For more information, see Create Indexes with Included Columns.

text, ntextimage를 제외한 모든 데이터 형식을 사용할 수 있습니다.All data types are allowed except text, ntext, and image. 지정된 키가 아닌 열 중 하나가 varchar(max), nvarchar(max) 또는 varbinary(max) 데이터 형식인 경우 인덱스를 오프라인으로 만들거나 다시 만들어야 합니다(ONLINE = OFF).The index must be created or rebuilt offline (ONLINE = OFF) if any one of the specified non-key columns are varchar(max), nvarchar(max), or varbinary(max) data types.

결정적이면서 정확하거나 정확하지 않은 계산 열은 포괄 열이 될 수 있습니다.Computed columns that are deterministic and either precise or imprecise can be included columns. image, ntext, text, varchar(max), nvarchar(max), varbinary(max)xml 데이터 형식에서 파생된 계산된 열은 해당 계산된 열 데이터 형식이 포함된 열로 허용된다면 키가 아닌 열에 포함할 수 있습니다.Computed columns derived from image, ntext, text, varchar(max), nvarchar(max), varbinary(max), and xml data types can be included in non-key columns as long as the computed column data types is allowable as an included column. 자세한 내용은 Indexes on Computed Columns을 참조하세요.For more information, see Indexes on Computed Columns.

XML 인덱스에 대한 자세한 내용은 CREATE XML INDEX (Transact-SQL)을 참조하세요.For information on creating an XML index, see CREATE XML INDEX (Transact-SQL).

WHERE <filter_predicate> 인덱스에 포함할 행을 지정하여 필터링된 인덱스를 만듭니다.WHERE <filter_predicate> Creates a filtered index by specifying which rows to include in the index. 필터링된 인덱스는 테이블의 비클러스터형 인덱스여야 합니다.The filtered index must be a nonclustered index on a table. 필터링된 인덱스의 데이터 행에 대한 필터링된 통계를 만듭니다.Creates filtered statistics for the data rows in the filtered index.

필터 조건자는 간단한 비교 논리를 사용하며 계산 열, UDT 열, 공간 데이터 형식 열 또는 HierarchyID 데이터 형식 열을 참조할 수 없습니다.The filter predicate uses simple comparison logic and cannot reference a computed column, a UDT column, a spatial data type column, or a hierarchyID data type column. 비교 연산자에는 NULL 리터럴을 사용한 비교를 사용할 수 없습니다.Comparisons using NULL literals are not allowed with the comparison operators. 대신 IS NULL 및 IS NOT NULL 연산자를 사용합니다.Use the IS NULL and IS NOT NULL operators instead.

다음은 Production.BillOfMaterials 테이블에 대한 필터 조건자의 몇 가지 예입니다.Here are some examples of filter predicates for the Production.BillOfMaterials table:

  • WHERE StartDate > '20000101' AND EndDate <= '20000630'

  • WHERE ComponentID IN (533, 324, 753)

  • WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

    필터링된 인덱스는 XML 인덱스 및 전체 텍스트 인덱스에는 적용되지 않습니다.Filtered indexes do not apply to XML indexes and full-text indexes. UNIQUE 인덱스의 경우에는 선택한 행만 고유 인덱스 값을 가져야 합니다.For UNIQUE indexes, only the selected rows must have unique index values. 필터링된 인덱스에서는 IGNORE_DUP_KEY 옵션이 허용되지 않습니다.Filtered indexes do not allow the IGNORE_DUP_KEY option.

ON partition_scheme_name ( column_name )ON partition_scheme_name ( column_name )
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

분할된 인덱스의 파티션이 매핑될 파일 그룹을 정의하는 파티션 구성표를 지정합니다.Specifies the partition scheme that defines the filegroups onto which the partitions of a partitioned index will be mapped. 파티션 구성표는 CREATE PARTITION SCHEME 또는 ALTER PARTITION SCHEME의 실행을 통해 데이터베이스 내에 있어야 합니다.The partition scheme must exist within the database by executing either CREATE PARTITION SCHEME or ALTER PARTITION SCHEME. column_name은 분할된 인덱스가 분할되는 기준으로 사용할 열을 지정합니다.column_name specifies the column against which a partitioned index will be partitioned. 이 열은 partition_scheme_name에서 사용하는 파티션 함수의 인수와 데이터 형식, 길이 및 전체 자릿수가 일치해야 합니다.This column must match the data type, length, and precision of the argument of the partition function that partition_scheme_name is using. column_name은 인덱스 정의의 열만 사용할 필요는 없으며column_name is not restricted to the columns in the index definition. 기본 테이블의 모든 열을 지정할 수 있습니다. 단, UNIQUE 인덱스를 분할할 때 고유 키로 사용되는 열 중에서 column_name을 선택해야 하는 경우는 제외합니다.Any column in the base table can be specified, except when partitioning a UNIQUE index, column_name must be chosen from among those used as the unique key. 이 제한 사항으로 인해 데이터베이스 엔진Database Engine은 단일 파티션 내에서만 키 값의 고유성을 확인할 수 있습니다.This restriction allows the 데이터베이스 엔진Database Engine to verify uniqueness of key values within a single partition only.

참고

비고유 클러스터형 인덱스를 분할하는 경우 데이터베이스 엔진Database Engine은 기본적으로 지정되지 않은 분할 열을 클러스터형 인덱스 키 목록에 추가합니다.When you partition a non-unique, clustered index, the 데이터베이스 엔진Database Engine by default adds the partitioning column to the list of clustered index keys, if it is not already specified. 비고유 비클러스터형 인덱스를 분할하는 경우 데이터베이스 엔진Database Engine은 지정되지 않은 분할 열을 인덱스의 키가 아닌 포괄 열로 추가합니다.When partitioning a non-unique, nonclustered index, the 데이터베이스 엔진Database Engine adds the partitioning column as a non-key (included) column of the index, if it is not already specified.

partition_scheme_name 또는 filegroup이 지정되지 않고 테이블이 분할된 경우 인덱스는 동일한 분할 열을 사용하여 동일한 파티션 구성표에 기본 테이블로 배치됩니다.If partition_scheme_name or filegroup is not specified and the table is partitioned, the index is placed in the same partition scheme, using the same partitioning column, as the underlying table.

참고

XML 인덱스에서 파티션 구성표를 지정할 수 없습니다.You cannot specify a partitioning scheme on an XML index. 기본 테이블이 분할되면 XML 인덱스는 테이블과 동일한 파티션 구성표를 사용합니다.If the base table is partitioned, the XML index uses the same partition scheme as the table.

분할 인덱스에 대한 자세한 내용은 분할된 테이블 및 인덱스를 참조하세요.For more information about partitioning indexes, Partitioned Tables and Indexes.

ON filegroup_nameON filegroup_name
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

주어진 파일 그룹에 지정된 인덱스를 만듭니다.Creates the specified index on the specified filegroup. 지정된 위치가 없고 테이블 또는 뷰가 분할되지 않은 경우 인덱스는 동일한 파일 그룹을 기본 테이블 또는 뷰로 사용합니다.If no location is specified and the table or view is not partitioned, the index uses the same filegroup as the underlying table or view. 파일 그룹은 이미 존재해야 합니다.The filegroup must already exist.

ON " default "ON " default "
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

기본 파일 그룹에 지정된 인덱스를 만듭니다.Creates the specified index on the default filegroup.

이 컨텍스트에서 default는 키워드가 아닙니다.The term default, in this context, is not a keyword. 이것은 기본 파일 그룹에 대한 식별자이며 ON " default " 또는 ON [ default ] 와 같이 구분되어야 합니다.It is an identifier for the default filegroup and must be delimited, as in ON " default " or ON [ default ]. "default"를 지정하면 현재 세션의 QUOTED_IDENTIFIER 옵션이 ON이어야 합니다.If "default" is specified, the QUOTED_IDENTIFIER option must be ON for the current session. 이 값은 기본 설정입니다.This is the default setting. 자세한 내용은 SET QUOTED_IDENTIFIER(Transact-SQL)를 참조하세요.For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ][ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

클러스터형 인덱스를 만들 때 테이블에 대한 FILESTREAM 데이터의 위치를 지정합니다.Specifies the placement of FILESTREAM data for the table when a clustered index is created. FILESTREAM_ON 절에서 FILESTREAM 데이터를 다른 FILESTREAM 파일 그룹 또는 파티션 구성표로 이동할 수 있습니다.The FILESTREAM_ON clause allows FILESTREAM data to be moved to a different FILESTREAM filegroup or partition scheme.

filestream_filegroup_name은 FILESTREAM 파일 그룹의 이름입니다.filestream_filegroup_name is the name of a FILESTREAM filegroup. 파일 그룹에는 CREATE DATABASE 또는 ALTER DATABASE 문을 사용하여 파일 그룹에 대해 정의된 파일이 하나 포함되어야 하며, 그렇지 않으면 오류가 발생합니다.The filegroup must have one file defined for the filegroup by using a CREATE DATABASE or ALTER DATABASE statement; otherwise, an error is raised.

테이블이 분할된 경우에는 FILESTREAM_ON 절이 포함되어야 하며 이 절에서 테이블의 파티션 구성표와 동일한 파티션 함수 및 파티션 열을 사용하는 FILESTREAM 파일 그룹의 파티션 구성표를 지정해야 합니다.If the table is partitioned, the FILESTREAM_ON clause must be included and must specify a partition scheme of FILESTREAM filegroups that uses the same partition function and partition columns as the partition scheme for the table. 그렇지 않으면 오류가 발생합니다.Otherwise, an error is raised.

테이블이 분할되지 않은 경우에는 FILESTREAM 열을 분할할 수 없습니다.If the table is not partitioned, the FILESTREAM column cannot be partitioned. 테이블의 FILESTREAM 데이터는 FILESTREAM_ON 절에 지정된 단일 파일 그룹에 저장되어야 합니다.FILESTREAM data for the table must be stored in a single filegroup that is specified in the FILESTREAM_ON clause.

클러스터형 인덱스가 생성되고 있고 테이블에 FILESTREAM 열이 포함되지 않은 경우 CREATE INDEX 문에 FILESTREAM_ON NULL을 지정할 수 있습니다.FILESTREAM_ON NULL can be specified in a CREATE INDEX statement if a clustered index is being created and the table does not contain a FILESTREAM column.

자세한 내용은 FILESTREAM(SQL Server)을 참조하세요.For more information, see FILESTREAM (SQL Server).

<object>::=<object>::=

인덱스할 정규화되거나 정규화되지 않은 개체입니다.Is the fully qualified or nonfully qualified object to be indexed.

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 to be indexed.

인덱스를 만들 뷰는 SCHEMABINDING으로 정의되어야 합니다.The view must be defined with SCHEMABINDING to create an index on it. 뷰에 비클러스터형 인덱스를 만들려면 먼저 고유 클러스터형 인덱스를 만들어야 합니다.A unique clustered index must be created on a view before any nonclustered index is created. 인덱싱된 뷰에 대한 자세한 내용은 주의 섹션을 참조하세요.For more information about indexed views, see the Remarks section.

SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 개체는 클러스터형 columnstore 인덱스와 함께 저장된 테이블일 수 있습니다.Beginning with SQL Server 2016(13.x)SQL Server 2016 (13.x), the object can be a table stored with a clustered columnstore index.

Azure SQL 데이터베이스Azure SQL Database는 세 부분으로 구성된 이름 형식(database_name.[* schema_name ].object_name)을 지원합니다. 단, *database_name이 현재 데이터베이스이거나 database_name이 tempdb이고 object_name이 #으로 시작해야 합니다. supports the three-part name format *database_name.[ schema_name ].*object_name when the database_name is the current database or the database_name is tempdb and the object_name starts with #.

<relational_index_option>::=<relational_index_option>::=

인덱스를 만들 때 사용할 옵션을 지정합니다.Specifies the options to use when you create the index.

PAD_INDEX = { ON | OFF }PAD_INDEX = { ON | OFF }
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

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

ONON
fillfactor로 지정된 사용 가능한 공간의 비율이 인덱스의 중간 수준 페이지에 적용됩니다.The percentage of free space that is specified by fillfactor is applied to the intermediate-level pages of the index.

OFF 또는 fillfactor를 지정되지 않음OFF or fillfactor is not specified
중간 수준 페이지는 중간 페이지의 키 집합을 고려하며 인덱스가 가질 수 있는 최대 크기의 한 행에 필요한 공간을 충분히 남기고 용량을 거의 채웁니다.The intermediate-level pages are filled to near capacity, leaving sufficient space for at least one row of the maximum size the index can have, considering the set of keys on the intermediate pages.

PAD_INDEX는 FILLFACTOR에 지정된 비율을 사용하므로 FILLFACTOR가 지정된 경우에만 PAD_INDEX 옵션을 사용할 수 있습니다.The PAD_INDEX option is useful only when FILLFACTOR is specified, because PAD_INDEX uses the percentage specified by FILLFACTOR. FILLFACTOR에 지정된 비율이 한 행을 저장하기에도 부족하면 데이터베이스 엔진Database Engine은 내부적으로 허용된 최소 비율을 무시합니다.If the percentage specified for FILLFACTOR is not large enough to allow for one row, the 데이터베이스 엔진Database Engine internally overrides the percentage to allow for the minimum. fillfactor 값이 아무리 작더라도 중간 인덱스 페이지의 행 수는 두 개 이상입니다.The number of rows on an intermediate index page is never less than two, regardless of how low the value of fillfactor.

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

FILLFACTOR =fillfactorFILLFACTOR =fillfactor
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure 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 rebuild. fillfactor는 1에서 100 사이의 정수 값이어야 하며fillfactor must be an integer value from 1 to 100. fillfactor가 100이면 데이터베이스 엔진Database Engine는 리프 페이지가 꽉 찬 인덱스를 만듭니다.If fillfactor is 100, the 데이터베이스 엔진Database Engine creates indexes with leaf pages filled to capacity.

FILLFACTOR 설정은 인덱스를 만들거나 다시 작성하는 경우에만 적용됩니다.The FILLFACTOR setting applies only when the index is created or rebuilt. 데이터베이스 엔진Database Engine에서는 페이지에 지정된 비율의 빈 공간을 동적으로 유지하지 않습니다.The 데이터베이스 엔진Database Engine does not dynamically keep the specified percentage of empty space in the pages. 채우기 비율 설정을 보려면 sys.indexes 카탈로그 뷰를 사용하세요.To view the fill factor setting, use the sys.indexes catalog view.

중요

데이터베이스 엔진Database Engine은 클러스터형 인덱스를 만들 때 데이터를 다시 배포하므로 FILLFACTOR가 100 미만인 클러스터형 인덱스를 만들면 데이터가 차지하는 저장 공간 크기에 영향을 줍니다.Creating a clustered index with a FILLFACTOR less than 100 affects the amount of storage space the data occupies because the 데이터베이스 엔진Database Engine redistributes the data when it creates the clustered index.

자세한 내용은 인덱스의 채우기 비율 지정을 참조하세요.For more information, see Specify Fill Factor for an Index.

SORT_IN_TEMPDB = { ON | OFF }SORT_IN_TEMPDB = { ON | OFF }
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

tempdb에 임시 정렬 결과를 저장할지 여부를 지정합니다.Specifies whether to store temporary sort results in tempdb. 기본값은 OFF입니다.The default is OFF.

ONON
인덱스 작성에 사용된 중간 정렬 결과가 tempdb에 저장됩니다.The intermediate sort results that are used to build the index are stored in tempdb. 이 경우 사용자 데이터베이스가 아닌 다른 디스크 집합에 tempdb가 있으면 인덱스 생성에 필요한 시간이 단축될 수 있습니다.This may reduce the time required to create an index if tempdb is on a different set of disks than the user database. 그러나 인덱스 작성 중에 사용되는 디스크 공간의 크기는 커집니다.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.

사용자 데이터베이스에서 인덱스를 만드는 데 필요한 공간 외에 tempdb에는 중간 정렬 결과를 저장할 정도의 동일한 공간이 추가로 필요합니다.In addition to the space required in the user database to create the index, tempdb must have about the same amount of additional space to hold the intermediate sort results. 자세한 내용은 인덱스에 대한 SORT_IN_TEMPDB 옵션을 참조하세요.For more information, see SORT_IN_TEMPDB Option For Indexes.

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

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. CREATE INDEX, ALTER INDEX 또는 UPDATE를 실행하는 경우에는 이 옵션이 아무런 영향을 미치지 않습니다.The option has no effect when executing CREATE INDEX, ALTER INDEX, or UPDATE. 기본값은 OFF입니다.The default is OFF.

ONON
중복된 키 값이 고유 인덱스에 삽입되는 경우 경고 메시지가 나타나고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.

ONON
이전 통계가 자동으로 다시 계산되지 않습니다.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 involving the table.

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

STATISTICS_INCREMENTAL = { ON | OFF }STATISTICS_INCREMENTAL = { ON | OFF }
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.

DROP_EXISTING = { ON | OFF }DROP_EXISTING = { ON | OFF }
수정된 열 사양을 사용하여 기존 클러스터형 또는 비클러스터형 인덱스를 삭제하고 다시 만들며 인덱스 이름을 동일하게 유지하는 옵션입니다.Is an option to drop and rebuild the existing clustered or nonclustered index with modified column specifications, and keep the same name for the index. 기본값은 OFF입니다.The default is OFF.

ONON
기존 인덱스를 삭제하고 다시 만들도록 지정하며, 이름은 index_name 매개 변수와 같아야 합니다.Specifies to drop and rebuild the existing index, which must have the same name as the parameter index_name.

OFFOFF
기존 인덱스를 삭제하고 다시 만들지 않도록 지정합니다.Specifies not to drop and rebuild the existing index. 지정된 인덱스 이름이 이미 존재하는 경우 SQL Server 오류가 표시됩니다.SQL Server displays an error if the specified index name already exists.

DROP_EXISTING을 사용하여 다음을 변경할 수 있습니다.With DROP_EXISTING, you can change:

  • 비클러스터형 rowstore 인덱스를 클러스터형 rowstore 인덱스로.A nonclustered rowstore index to a clustered rowstore index.

DROP_EXISTING을 사용하여 다음을 변경할 수 없습니다.With DROP_EXISTING, you cannot change:

  • 클러스터형 rowstore 인덱스를 비클러스터형 rowstore 인덱스로.A clustered rowstore index to a nonclustered rowstore index.
  • 클러스터형 columnstore 인덱스를 임의 형식의 rowstore 인덱스로.A clustered columnstore index to any type of rowstore index.

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

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

참고

온라인 인덱스 작업은 일부 MicrosoftMicrosoft SQL ServerSQL Server 버전에서 사용할 수 있습니다.Online index operations are not available in every edition of MicrosoftMicrosoft 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.

ONON
인덱스 작업 중에 장기 테이블 잠금이 유지되지 않습니다.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 enables queries or updates to the underlying table and indexes to proceed. 작업이 시작되면 아주 짧은 기간 동안 S(공유) 잠금이 원본 개체에 유지됩니다.At the start of the operation, a Shared (S) lock is held on the source object for a very short period of time. 작업이 끝나면 짧은 기간 동안 비클러스터형 인덱스가 생성되는 경우에는 원본에 대해 S(공유) 잠금이 획득되고, 온라인 상태에서 클러스터형 인덱스가 생성 또는 삭제될 때와 클러스터형 또는 비클러스터형 인덱스가 다시 작성될 때는 SCH-M(스키마 수정) 잠금이 획득됩니다.At the end of the operation, for a short period of time, an S (Shared) lock is acquired 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 and 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. 클러스터형 인덱스를 생성, 다시 작성 또는 삭제하거나 비클러스터형 인덱스를 다시 작성 또는 삭제하는 오프라인 인덱스 작업을 통해 테이블의 SCH-M(스키마 수정) 잠금을 획득합니다.An offline index operation that creates, rebuilds, or drops a clustered 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.

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

전역 임시 테이블의 인덱스를 포함한 인덱스는 다음 예외의 경우를 제외하고 온라인 상태로 만들 수 있습니다.Indexes, including indexes on global temp tables, can be created online with the following exceptions:

  • XML 인덱스XML index
  • 로컬 임시 테이블의 인덱스Index on a local temp table.
  • 뷰의 초기 고유 클러스터형 인덱스Initial unique clustered index on a view.
  • 해제된 클러스터형 인덱스Disabled clustered indexes.
  • 기본 테이블이 LOB 데이터 형식 image, ntext, text 및 공간 유형을 포함하는 경우 클러스터형 인덱스입니다.Clustered index if the underlying table contains LOB data types: image, ntext, text, and spatial 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)부터) 및 SQL 데이터베이스SQL Database에서 테이블에 varchar(max) 또는 varbinary(max) 열이 포함된 경우 ONLINE 옵션을 사용하여 다른 열을 포함하는 클러스터형 인덱스를 작성하거나 다시 작성할 수 있습니다.In SQL ServerSQL Server (beginning with SQL Server 2012(11.x)SQL Server 2012 (11.x)) and in SQL 데이터베이스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. SQL 데이터베이스SQL Database는 기본 테이블에 varchar(max) 또는 varbinary(max) 열이 포함된 경우 ONLINE 옵션을 허용하지 않습니다. does not permit the ONLINE option when the base table contains varchar(max) or varbinary(max) columns.

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

ALLOW_ROW_LOCKS = { ON | OFF }ALLOW_ROW_LOCKS = { ON | OFF }
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

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

ONON
인덱스에 액세스할 때 행 잠금이 허용됩니다.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 Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

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

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

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

MAXDOP = max_degree_of_parallelismMAXDOP = max_degree_of_parallelism
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure 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.

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 or fewer based on the current system workload.

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.

참고

병렬 인덱스 작업은 일부 MicrosoftMicrosoft SQL ServerSQL Server 버전에서 사용할 수 있습니다.Parallel index operations are not available in every edition of MicrosoftMicrosoft SQL ServerSQL Server. SQL ServerSQL Server 버전에서 지원되는 기능 목록은 SQL Server 2016에 대한 버전 및 지원되는 기능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 and Editions and Supported Features for SQL Server 2017.

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.

ROWROW
인덱스 또는 지정된 파티션이 행 압축을 사용하여 압축됩니다.Index or specified partitions are compressed by using row compression.

PAGEPAGE
인덱스 또는 지정된 파티션이 페이지 압축을 사용하여 압축됩니다.Index or specified partitions are compressed by using page compression.

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

ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] ) ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )
적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure 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, for example: 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)  
);  

RemarksRemarks

CREATE INDEX 문은 다른 쿼리와 마찬가지로 최적화됩니다.The CREATE INDEX statement is optimized like any other query. I/O 작업을 줄이기 위해 쿼리 프로세서에서 테이블 검색을 수행하는 대신 다른 인덱스를 검색하도록 선택할 수도 있습니다.To save on I/O operations, the query processor may choose to scan another index instead of performing a table scan. 정렬 작업을 제거해야 하는 경우도 있습니다.The sort operation may be eliminated in some situations. 다중 프로세서 컴퓨터에서 CREATE INDEX는 다른 쿼리에서 수행하는 것과 같은 방법으로 더 많은 프로세서를 사용하여 인덱스 만들기와 관련된 스캔 및 정렬 작업을 수행할 수 있습니다.On multiprocessor computers CREATE INDEX can use more processors to perform the scan and sort operations associated with creating the index, in the same way as other queries do. 자세한 내용은 병렬 인덱스 작업 구성을 참조하세요.For more information, see Configure Parallel Index Operations.

데이터베이스 복구 모델이 대량 로그 또는 단순으로 설정된 경우 인덱스 생성 작업은 최소로 기록될 수 있습니다.The create index operation can be minimally logged if the database recovery model is set to either bulk-logged or simple.

임시 테이블에 인덱스를 만들 수 있습니다.Indexes can be created on a temporary table. 테이블이 삭제되거나 세션이 종료되면 인덱스가 삭제됩니다.When the table is dropped or the session ends, the indexes are dropped.

인덱스는 확장 속성을 지원합니다.Indexes support extended properties.

클러스터형 인덱스Clustered Indexes

테이블(힙)에 클러스터형 인덱스를 만들거나 기존 클러스터형 인덱스를 삭제하고 다시 만들려면 데이터베이스에서 데이터 정렬 및 원본 테이블의 임시 사본이나 기존 클러스터형 인덱스 데이터의 임시 사본을 보관할 수 있는 추가 작업 영역이 필요합니다.Creating a clustered index on a table (heap) or dropping and re-creating an existing clustered index requires additional workspace to be available in the database to accommodate data sorting and a temporary copy of the original table or existing clustered index data. 클러스터형 인덱스에 대한 자세한 내용은 클러스터형 인덱스 만들기를 참조하세요.For more information about clustered indexes, see Create Clustered Indexes.

비클러스터형 인덱스Nonclustered Indexes

SQL Server 2016(13.x)SQL Server 2016 (13.x)부터, 그리고 Azure SQL 데이터베이스Azure SQL Database에서는 클러스터형 columnstore 인덱스로 저장된 테이블에 비클러스터형 인덱스를 만들 수 있습니다.Beginning with SQL Server 2016(13.x)SQL Server 2016 (13.x) and in Azure SQL 데이터베이스Azure SQL Database, you can create a nonclustered index on a table stored as a clustered columnstore index. 힙 또는 클러스터형 인덱스로 저장된 테이블에 비클러스터형 인덱스를 먼저 만드는 경우, 나중에 테이블을 클러스터형 columnstore 인덱스로 변환하면 인덱스가 유지됩니다.If you first create a nonclustered index on a table stored as a heap or clustered index, the index will persist if you later convert the table to a clustered columnstore index. 또한 클러스터형 columnstore 인덱스를 다시 작성할 때 비클러스터형 인덱스를 삭제하지 않아도 됩니다.It is also not necessary to drop the nonclustered index when you rebuild the clustered columnstore index.

제한 사항:Limitations and Restrictions:

  • FILESTREAM_ON 옵션은 클러스터형 columnstore 인덱스로 저장된 테이블에 비클러스터형 인덱스를 만드는 경우 유효하지 않습니다.The FILESTREAM_ON option is not valid when you create a nonclustered index on a table stored as a clustered columnstore index.

고유 인덱스Unique Indexes

고유 인덱스가 있으면 데이터베이스 엔진Database Engine은 삽입 작업으로 데이터를 추가할 때마다 중복 값이 있는지 확인합니다.When a unique index exists, the 데이터베이스 엔진Database Engine checks for duplicate values each time data is added by a insert operations. 중복 키 값을 생성하는 삽입 작업은 롤백되며 데이터베이스 엔진Database Engine에서는 오류 메시지를 표시합니다.Insert operations that would generate duplicate key values are rolled back, and the 데이터베이스 엔진Database Engine displays an error message. 이런 현상은 삽입 작업을 통해 많은 행을 변경할 때 중복 값이 하나만 있어도 발생합니다.This is true even if the insert operation changes many rows but causes only one duplicate. 고유 인덱스가 있고 IGNORE_DUP_KEY 절이 ON으로 설정된 경우 데이터를 입력하려고 하면 UNIQUE 인덱스를 위반하는 행만 실패합니다.If an attempt is made to enter data for which there is a unique index and the IGNORE_DUP_KEY clause is set to ON, only the rows violating the UNIQUE index fail.

분할된 인덱스Partitioned Indexes

분할된 인덱스는 분할된 테이블과 비슷한 방법으로 만들어지며 유지 관리됩니다. 그러나 보통 인덱스와 같이 별도의 데이터베이스 개체로 처리됩니다.Partitioned indexes are created and maintained in a similar manner to partitioned tables, but like ordinary indexes, they are handled as separate database objects. 분할되지 않은 테이블에 분할된 인덱스가 있을 수 있으며 분할된 테이블에 분할되지 않은 인덱스가 있을 수 있습니다.You can have a partitioned index on a table that is not partitioned, and you can have a nonpartitioned index on a table that is partitioned.

분할된 테이블에 인덱스를 만들고 인덱스를 배치할 파일 그룹을 지정하지 않으면 인덱스는 기본 테이블과 같은 방법으로 분할됩니다.If you are creating an index on a partitioned table, and do not specify a filegroup on which to place the index, the index is partitioned in the same manner as the underlying table. 이렇게 되는 이유는 기본적으로 인덱스가 기본 테이블처럼 동일한 파일 그룹에 배치되고 동일한 분할 열을 사용하는 동일한 파티션 구성표의 분할된 테이블에 대해 배치되기 때문입니다.This is because indexes, by default, are placed on the same filegroups as their underlying tables, and for a partitioned table in the same partition scheme that uses the same partitioning columns. 인덱스에 테이블과 동일한 파티션 구성표 및 분할 열을 사용하는 경우 인덱스는 테이블과 함께 정렬됩니다.When the index uses the same partition scheme and partitioning column as the table, the index is aligned with the table.

경고

파티션 수가 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. 파티션 수가 1,000개를 초과하는 경우에는 정렬된 인덱스만 사용하는 것이 좋습니다.We recommend using only aligned indexes when the number of partitions exceed 1,000.

비고유 클러스터형 인덱스를 분할하는 경우 데이터베이스 엔진Database Engine은 기본적으로 지정되지 않은 모든 분할 열을 클러스터형 인덱스 키 목록에 추가합니다.When partitioning a non-unique, clustered index, the 데이터베이스 엔진Database Engine by default adds any partitioning columns to the list of clustered index keys, if not already specified.

인덱싱된 뷰는 테이블의 인덱스와 같은 방법으로 분할된 테이블에 만들 수 있습니다.Indexed views can be created on partitioned tables in the same manner as indexes on tables. 분할된 인덱스에 대한 자세한 내용은 Partitioned Tables and Indexes를 참조하세요.For more information about partitioned indexes, see Partitioned Tables and Indexes.

SQL Server 2017SQL Server 2017에서는 분할된 인덱스를 만들거나 다시 작성할 때 테이블의 모든 행을 검사하여 통계를 작성하지 않습니다.In SQL Server 2017SQL Server 2017, statistics are not created by scanning all the rows in the table when a partitioned index is created or rebuilt. 대신 쿼리 최적화 프로그램에서 기본 샘플링 알고리즘을 사용하여 통계를 생성합니다.Instead, the query optimizer uses the default sampling algorithm to generate statistics. 테이블의 모든 행을 검사하여 분할된 인덱스에 대한 통계를 얻으려면 FULLSCAN 절에서 CREATE STATISTICS 또는 UPDATE STATISTICS를 사용합니다.To obtain statistics on partitioned indexes by scanning all the rows in the table, use CREATE STATISTICS or UPDATE STATISTICS with the FULLSCAN clause.

필터링된 인덱스Filtered Indexes

필터링된 인덱스는 테이블에서 적은 비율의 행을 선택하는 쿼리에 적합한 최적화된 비클러스터형 인덱스입니다.A filtered index is an optimized nonclustered index, suited for queries that select a small percentage of rows from a table. 이 인덱스에서는 필터 조건자를 사용하여 테이블의 일부 데이터를 인덱싱합니다.It uses a filter predicate to index a portion of the data in the table. 잘 디자인된 필터링된 인덱스는 쿼리 성능을 개선하고 저장소 비용과 유지 관리 비용을 줄일 수 있습니다.A well-designed filtered index can improve query performance, reduce storage costs, and reduce maintenance costs.

필터링된 인덱스에 필요한 SET 옵션Required SET Options for Filtered Indexes

다음 조건이 발생할 때마다 필요한 값 열에 SET 옵션을 사용해야 합니다.The SET options in the Required Value column are required whenever any of the following conditions occur:

  • 필터링된 인덱스를 만듭니다.Create a filtered index.
  • INSERT, UPDATE, DELETE 또는 MERGE 작업으로 필터링된 인덱스의 데이터를 수정합니다.INSERT, UPDATE, DELETE, or MERGE operation modifies the data in a filtered index.
  • 필터링된 인덱스는 쿼리 최적화 프로그램이 쿼리 계획을 작성할 때 사용됩니다.The filtered index is used by the query optimizer to produce the query plan.

    Set 옵션SET options 필요한 값Required value 기본 서버 값Default server value DefaultDefault

    OLE DB 및 ODBC 값OLE DB and ODBC value
    DefaultDefault

    DB-Library 값DB-Library value
    ANSI_NULLSANSI_NULLS ONON ONON ONON OFFOFF
    ANSI_PADDINGANSI_PADDING ONON ONON ONON OFFOFF
    ANSI_WARNINGS*ANSI_WARNINGS* ONON ONON ONON OFFOFF
    ARITHABORTARITHABORT ONON ONON OFFOFF OFFOFF
    CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL ONON ONON ONON OFFOFF
    NUMERIC_ROUNDABORTNUMERIC_ROUNDABORT OFFOFF OFFOFF OFFOFF OFFOFF
    QUOTED_IDENTIFIERQUOTED_IDENTIFIER ONON ONON ONON OFFOFF

    *데이터베이스 호환성 수준이 90 이상으로 설정된 경우 ANSI_WARNINGS를 ON으로 설정하면 암시적으로 ARITHABORT가 ON으로 설정됩니다.*Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher. 데이터베이스 호환성 수준이 80 이하로 설정된 경우에는 명시적으로 ARITHABORT 옵션을 ON으로 설정해야 합니다.If the database compatibility level is set to 80 or earlier, the ARITHABORT option must explicitly be set to ON.

    SET 옵션이 올바르지 않은 경우 다음 조건이 발생할 수 있습니다.If the SET options are incorrect, the following conditions can occur:

  • 필터링된 인덱스가 만들어지지 않습니다.The filtered index is not created.

  • 데이터베이스 엔진Database Engine에서 오류를 생성하고 인덱스의 데이터를 변경하는 INSERT, UPDATE, DELETE 또는 MERGE 문을 롤백합니다.The 데이터베이스 엔진Database Engine generates an error and rolls back INSERT, UPDATE, DELETE, or MERGE statements that change data in the index.
  • 쿼리 최적화 프로그램에서 Transact-SQL 문의 실행 계획에 있는 인덱스를 고려하지 않습니다.Query optimizer does not consider the index in the execution plan for any Transact-SQL statements.

    필터링된 인덱스에 대한 자세한 내용은 필터링된 인덱스 만들기를 참조하세요.For more information about Filtered Indexes, see Create Filtered Indexes.

공간 인덱스Spatial Indexes

공간 인덱스에 대한 자세한 내용은 CREATE SPATIAL INDEX (Transact-SQL)공간 인덱스 개요를 참조하세요.For information about spatial indexes, see CREATE SPATIAL INDEX (Transact-SQL) and Spatial Indexes Overview.

XML 인덱스XML Indexes

XML 인덱스에 대한 자세한 내용은 CREATE XML INDEX (Transact-SQL)XML 인덱스 (SQL Server)를 참조하세요.For information about XML indexes see, CREATE XML INDEX (Transact-SQL) and XML Indexes (SQL Server).

인덱스 키 크기Index Key Size

인덱스 키의 최대 크기는 클러스터형 인덱스의 경우 900바이트, 비클러스터형 인덱스의 경우 1,700바이트입니다.The maximum size for an index key is 900 bytes for a clustered index and 1,700 bytes for a nonclustered index. ( SQL 데이터베이스SQL Database V12 및 SQL Server 2016(13.x)SQL Server 2016 (13.x) 이전의 한도는 항상 900바이트였습니다.) 인덱스가 만들어질 때 바이트 한도를 초과하는 varchar 열의 기존 데이터가 한도를 초과하지 않는 경우 인덱스를 만들 수 있습니다. 그러나 전체 크기가 한도를 초과하는 열에 대한 이후 삽입 작업이나 업데이트 동작은 실패합니다.(Before SQL 데이터베이스SQL Database V12 and SQL Server 2016(13.x)SQL Server 2016 (13.x) the limit was always 900 bytes.) Indexes on varchar columns that exceed the byte limit can be created if the existing data in the columns do not exceed the limit at the time the index is created; however, subsequent insert or update actions on the columns that cause the total size to be greater than the limit will fail. 클러스터형 인덱스의 인덱스 키는 ROW_OVERFLOW_DATA 할당 단위에 기존 데이터가 있는 varchar 열을 포함할 수 없습니다.The index key of a clustered index cannot contain varchar columns that have existing data in the ROW_OVERFLOW_DATA allocation unit. varchar 열에 대한 클러스터형 인덱스를 만들고 기존 데이터가 IN_ROW_DATA 할당 단위에 있는 경우에는 데이터를 행 외부로 밀어넣는 열에 대한 후속 삽입 또는 업데이트 동작이 실패합니다.If a clustered index is created on a varchar column and the existing data is in the IN_ROW_DATA allocation unit, subsequent insert or update actions on the column that would push the data off-row will fail.

비클러스터형 인덱스는 인덱스의 리프 수준에 키가 아닌 열을 포함할 수 있습니다.Nonclustered indexes can include non-key columns in the leaf level of the index. 인덱스 키 크기를 계산할 때 데이터베이스 엔진Database Engine은 이러한 열을 고려하지 않습니다.These columns are not considered by the 데이터베이스 엔진Database Engine when calculating the index key size . 자세한 내용은 Create Indexes with Included Columns을 참조하세요.For more information, see Create Indexes with Included Columns.

참고

테이블이 분할된 경우 분할 키 열이 비고유 클러스터형 인덱스에 아직 없으면 데이터베이스 엔진Database Engine에 의해 해당 열이 인덱스에 추가됩니다.When tables are partitioned, if the partitioning key columns are not already present in a non-unique clustered index, they are added to the index by the 데이터베이스 엔진Database Engine. 인덱싱된 열(포함 열 제외)과 추가된 분할 열의 결합된 크기는 비고유 클러스터형 인덱스에서 1,800바이트를 초과할 수 없습니다.The combined size of the indexed columns (not counting included columns), plus any added partitioning columns cannot exceed 1800 bytes in a non-unique clustered index.

계산 열Computed Columns

계산 열에 인덱스를 만들 수 있습니다.Indexes can be created on computed columns. 또한 계산 열은 PERSISTED 속성을 가질 수 있습니다.In addition, computed columns can have the property PERSISTED. 즉, 데이터베이스 엔진Database Engine 은 계산된 값을 테이블에 저장하고 계산 열이 종속된 다른 열이 업데이트되면 해당 값을 업데이트합니다.This means that the 데이터베이스 엔진Database Engine stores the computed values in the table, and updates them when any other columns on which the computed column depends are updated. 데이터베이스 엔진Database Engine 은 열에 인덱스를 만들 때와 이 인덱스가 쿼리에서 참조될 때 이러한 지속형 값을 사용합니다.The 데이터베이스 엔진Database Engine uses these persisted values when it creates an index on the column, and when the index is referenced in a query.

계산 열을 인덱싱하려면 계산 열이 결정적이고 정확해야 합니다.To index a computed column, the computed column must deterministic and precise. 그러나 PERSISTED 속성을 사용하면 인덱싱할 수 있는 계산 열 유형이 다음을 포함하도록 확장할 수 있습니다.However, using the PERSISTED property expands the type of indexable computed columns to include:

  • Transact-SQLTransact-SQL을 기반으로 하는 계산 열 및 사용자가 결정적으로 표시한 CLR 사용자 정의 형식 메서드 및 CLR 함수Computed columns based on Transact-SQLTransact-SQL and CLR functions and CLR user-defined type methods that are marked deterministic by the user.
  • 데이터베이스 엔진Database Engine이 정의한 대로 결정적이지만 정확하지 않은 식을 기반으로 하는 계산 열Computed columns based on expressions that are deterministic as defined by the 데이터베이스 엔진Database Engine but imprecise.

    지속형 계산 열의 경우 다음 SET 옵션을 앞부분에 나온 "인덱싱된 뷰에 필요한 SET 옵션" 섹션처럼 설정해야 합니다.Persisted computed columns require the following SET options to be set as shown in the previous section "Required SET Options for Indexed Views".

    UNIQUE나 PRIMARY KEY 제약 조건은 인덱싱을 위해 모든 조건을 충족하는 한 계산 열을 포함할 수 있습니다.The UNIQUE or PRIMARY KEY constraint can contain a computed column as long as it satisfies all conditions for indexing. 특히 계산 열은 결정적이고 정확하거나 결정적이고 지속되어야 합니다.Specifically, the computed column must be deterministic and precise or deterministic and persisted. 결정성에 대한 자세한 내용은 결정적 함수 및 비결정적 함수를 참조하세요.For more information about determinism, see Deterministic and Nondeterministic Functions.

    image, ntext, text, varchar(max), nvarchar(max), varbinary(max)xml 데이터 형식에서 파생된 계산된 열은 계산된 열 데이터 형식이 인덱스 키 열 또는 키가 아닌 열로 허용된다면 키로 인덱싱하거나 키가 아닌 열을 포함할 수 있습니다.Computed columns derived from image, ntext, text, varchar(max), nvarchar(max), varbinary(max), and xml data types can be indexed either as a key or included non-key column as long as the computed column data type is allowable as an index key column or non-key column. 예를 들어 계산된 xml 열에 기본 XML 인덱스를 만들 수 없습니다.For example, you cannot create a primary XML index on a computed xml column. 인덱스 키 크기가 900바이트를 초과하면 경고 메시지가 표시됩니다.If the index key size exceeds 900 bytes, a warning message is displayed.

    계산 열에 인덱스를 만들면 이전에 작업한 삽입 또는 업데이트 작업이 실패할 수 있습니다.Creating an index on a computed column may cause the failure of an insert or update operation that previously worked. 계산 열에서 산술 오류가 발생하는 경우 이러한 실패가 발생할 수 있습니다.Such a failure may take place when the computed column results in arithmetic error. 예를 들어 다음 테이블의 계산 열 c에 산술 오류가 발생해도 INSERT 문은 실행됩니다.For example, in the following table, although computed column c results in an arithmetic error, the INSERT statement works.

CREATE TABLE t1 (a int, b int, c AS a/b);  
INSERT INTO t1 VALUES (1, 0);  

대신 테이블을 만든 후 계산 열 c에 인덱스를 만들면 동일한 INSERT 문이 이번에는 실패합니다.If, instead, after creating the table, you create an index on computed column c, the same INSERT statement will now fail.

CREATE TABLE t1 (a int, b int, c AS a/b);  
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c);  
INSERT INTO t1 VALUES (1, 0);  

자세한 내용은 Indexes on Computed Columns을 참조하세요.For more information, see Indexes on Computed Columns.

인덱스의 포괄 열Included Columns in Indexes

포괄 열이라고 하는 키가 아닌 열은 비클러스터형 인덱스의 리프 수준에 추가되어 쿼리를 포함함으로써 쿼리 성능을 향상시킬 수 있습니다.Non-key columns, called included columns, can be added to the leaf level of a nonclustered index to improve query performance by covering the query. 즉, 쿼리에서 참조되는 모든 열은 키 열 또는 키가 아닌 열로 인덱스에 포함됩니다.That is, all columns referenced in the query are included in the index as either key or non-key columns. 따라서 쿼리 최적화 프로그램은 인덱스 스캔에서 필요한 모든 정보를 찾을 수 있으므로 테이블 또는 클러스터형 인덱스 데이터에 액세스되지 않습니다.This allows the query optimizer to locate all the required information from an index scan; the table or clustered index data is not accessed. 자세한 내용은 Create Indexes with Included Columns을 참조하세요.For more information, see Create Indexes with Included Columns.

인덱스 옵션 지정Specifying Index Options

SQL Server 2005SQL Server 2005에는 새 인덱스 옵션이 추가되었으며 옵션 지정 방법도 수정되었습니다. introduced new index options and also modifies the way in which options are specified. 이전 버전과 호환되는 구문에서 WITH option_name은 WITH ( <option_name> = ON ) 과 같습니다.In backward compatible syntax, WITH option_name is equivalent to WITH ( <option_name> = ON ). 인덱스 옵션을 설정하면 다음 규칙이 적용됩니다.When you set index options, the following rules apply:

  • 새 인덱스 옵션은 WITH (option_name = ON | OFF)를 사용해서만 지정할 수 있습니다.New index options can only be specified by using WITH (option_name = ON | OFF).
  • 옵션은 동일한 문에 이전 버전과 호환되는 구문 및 새 구문 모두를 사용하여 지정할 수 없습니다.Options cannot be specified by using both the backward compatible and new syntax in the same statement. 예를 들어 WITH (DROP_EXISTING, ONLINE = ON)을 지정하면 문이 실패합니다.For example, specifying WITH (DROP_EXISTING, ONLINE = ON) causes the statement to fail.
  • XML 인덱스를 만들 때 WITH(option_name= ON | OFF)를 사용하여 옵션을 지정해야 합니다.When you create an XML index, the options must be specified by using WITH (option_name= ON | OFF).

DROP_EXISTING 절DROP_EXISTING Clause

DROP_EXISTING 절을 사용하여 인덱스 다시 작성, 열 추가 또는 삭제, 옵션 수정, 열 정렬 순서 수정 또는 파티션 구성표나 파일 그룹 변경 등의 작업을 수행할 수 있습니다.You can use the DROP_EXISTING clause to rebuild the index, add or drop columns, modify options, modify column sort order, or change the partition scheme or filegroup.

인덱스가 PRIMARY KEY 또는 UNIQUE 제약 조건을 강제 적용하고 인덱스 정의가 변경되지 않으면 이 인덱스는 삭제되고 기존 제약 조건을 보존한 상태에서 다시 만들어집니다.If the index enforces a PRIMARY KEY or UNIQUE constraint and the index definition is not altered in any way, the index is dropped and re-created preserving the existing constraint. 그러나 인덱스 정의가 변경되면 이 문은 실패합니다.However, if the index definition is altered the statement fails. PRIMARY KEY 또는 UNIQUE 제약 조건의 정의를 변경하려면 제약 조건을 삭제하고 새 정의가 있는 제약 조건을 추가합니다.To change the definition of a PRIMARY KEY or UNIQUE constraint, drop the constraint and add a constraint with the new definition.

비클러스터형 인덱스가 있는 테이블에서 동일하거나 서로 다른 키 집합을 사용하여 클러스터형 인덱스를 다시 만들 때 DROP_EXISTING을 사용하면 성능이 향상됩니다.DROP_EXISTING enhances performance when you re-create a clustered index, with either the same or different set of keys, on a table that also has nonclustered indexes. DROP_EXISTING은 이전에 클러스터형 인덱스에 대해 DROP INDEX 문을 실행한 다음 새로 클러스터형 인덱스를 만드는 CREATE INDEX 문을 실행하는 것과 같습니다.DROP_EXISTING replaces the execution of a DROP INDEX statement on the old clustered index followed by the execution of a CREATE INDEX statement for the new clustered index. 비클러스터형 인덱스는 인덱스 정의가 변경된 경우에만 다시 한번 만들어집니다.The nonclustered indexes are rebuilt once, and then only if the index definition has changed. 인덱스 정의에 원래 인덱스와 같은 인덱스 이름, 키 및 파티션 열, 고유성 특성 및 정렬 순서가 있으면 DROP_EXISTING 절은 비클러스터형 인덱스를 다시 만들지 않습니다.The DROP_EXISTING clause does not rebuild the nonclustered indexes when the index definition has the same index name, key and partition columns, uniqueness attribute, and sort order as the original index.

비클러스터형 인덱스는 다시 만들지 여부에 관계없이 항상 원래 파일 그룹 또는 파티션 구성표에 남아 있으며 원래 파티션 함수를 사용합니다.Whether the nonclustered indexes are rebuilt or not, they always remain in their original filegroups or partition schemes and use the original partition functions. 클러스터형 인덱스를 다른 파일 그룹이나 파티션 구성표에 다시 만들면 비클러스터형 인덱스는 클러스터형 인덱스의 새 위치와 일치하도록 이동되지 않습니다.If a clustered index is rebuilt to a different filegroup or partition scheme, the nonclustered indexes are not moved to coincide with the new location of the clustered index. 따라서 비클러스터형 인덱스가 이전에 클러스터형 인덱스와 일치하도록 맞춰진 경우에도 일치하지 않을 수 있습니다.Therefore, even the nonclustered indexes previously aligned with the clustered index, they may no longer be aligned with it. 분할된 인덱스 정렬에 대한 자세한 내용은 다음을 참조하세요.For more information about partitioned index alignment, see.

인덱스 문이 비클러스터형 인덱스를 지정하고 ONLINE 옵션이 OFF로 설정되어 있지 않은 경우 동일 인덱스 키 열이 동일한 순서의 동일한 오름차순 또는 내림차순을 사용하면 DROP_EXISTING 절은 데이터를 다시 정렬하지 않습니다.The DROP_EXISTING clause will not sort the data again if the same index key columns are used in the same order and with the same ascending or descending order, unless the index statement specifies a nonclustered index and the ONLINE option is set to OFF. 클러스터형 인덱스가 해제되면 ONLINE을 OFF로 설정한 상태에서 CREATE INDEX WITH DROP_EXISTING 작업을 수행해야 합니다.If the clustered index is disabled, the CREATE INDEX WITH DROP_EXISTING operation must be performed with ONLINE set to OFF. 비클러스터형 인덱스가 해제되고 해제된 클러스터형 인덱스와 관련이 없는 경우에는 ONLINE을 OFF 또는 ON으로 설정한 상태에서 CREATE INDEX WITH DROP_EXISTING 작업을 수행할 수 있습니다.If a nonclustered index is disabled and is not associated with a disabled clustered index, the CREATE INDEX WITH DROP_EXISTING operation can be performed with ONLINE set to OFF or ON.

익스텐트가 128 이상인 인덱스를 삭제하거나 다시 작성하면 데이터베이스 엔진Database Engine은 트랜잭션이 커밋될 때까지 실제 페이지 할당 취소 및 이와 관련된 잠금을 지연합니다.When indexes with 128 extents or more are dropped or rebuilt, the 데이터베이스 엔진Database Engine defers the actual page deallocations, and their associated locks, until after the transaction commits.

ONLINE 옵션ONLINE Option

다음 지침은 인덱스 작업을 온라인 상태로 수행할 때 적용됩니다.The following guidelines apply for performing index operations online:

  • 온라인 인덱스 작업이 진행되는 동안에는 기본 테이블을 변경하거나 자르거나 삭제할 수 없습니다.The underlying table cannot be altered, truncated, or dropped while an online index operation is in process.
  • 인덱스 작업 중에 임시 디스크 공간이 추가로 필요합니다.Additional temporary disk space is required during the index operation.
  • 온라인 작업은 분할된 인덱스 및 지속형 계산 열이 들어 있는 인덱스 또는 포괄 열에서 수행될 수 있습니다.Online operations can be performed on partitioned indexes and indexes that contain persisted computed columns, or included columns.

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

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

ALLOW_ROW_LOCKS = ON이고 ALLOW_PAGE_LOCK = ON이면 인덱스에 액세스할 때 행, 페이지 및 테이블 수준 잠금이 허용됩니다.When ALLOW_ROW_LOCKS = ON and ALLOW_PAGE_LOCK = ON, row-, page-, and table-level locks are allowed when accessing 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 accessing the index.

인덱스 정보 보기Viewing Index Information

인덱스 정보를 반환하려면 카탈로그 뷰, 시스템 함수 및 시스템 저장 프로시저를 사용할 수 있습니다.To return information about indexes, you can use catalog views, system functions, and system stored procedures.

Data CompressionData Compression

데이터 압축은 데이터 압축 토픽에서 설명합니다.Data compression is described in the topic Data Compression. 고려해야 할 주요 요소는 다음과 같습니다.The following are key points to consider:

  • 압축하면 한 페이지에 더 많은 행을 저장할 수 있지만 최대 행 크기는 변경되지 않습니다.Compression can allow more rows to be stored on a page, but does not change the maximum row size.
  • 인덱스의 비-리프 페이지는 압축된 페이지가 아니지만 행은 압축할 수 있습니다.Non-leaf pages of an index are not page compressed but can be row compressed.
  • 각각의 비클러스터형 인덱스에는 개별 압축 설정이 있으며 기본 테이블의 압축 설정을 상속하지 않습니다.Each nonclustered index has an individual compression setting, and does not inherit the compression setting of the underlying table.
  • 힙에 클러스터형 인덱스를 만드는 경우 이 클러스터형 인덱스는 다른 압축 상태를 지정하지 않는 한 힙의 압축 상태를 상속합니다.When a clustered index is created on a heap, the clustered index inherits the compression state of the heap unless an alternative compression state is specified.

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

  • 테이블에 정렬되지 않은 인덱스가 있으면 단일 파티션의 압축 설정을 변경할 수 없습니다.You cannot change the compression setting of a single partition if the table has nonaligned indexes.

  • The ALTER INDEX <index> ... REBUILD PARTITION ... 구문은 인덱스의 지정된 파티션을 다시 작성합니다.The ALTER INDEX <index> ... REBUILD PARTITION ... syntax rebuilds the specified partition of the index.
  • The ALTER INDEX <index> ... REBUILD WITH ... 구문은 인덱스의 모든 파티션을 다시 작성합니다.The ALTER INDEX <index> ... REBUILD WITH ... syntax rebuilds all partitions of the index.

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

사용 권한Permissions

테이블이나 뷰에 대한 ALTER 권한이 필요합니다.Requires ALTER permission on the table or view. 사용자는 sysadmin 고정 서버 역할의 멤버 또는 db_ddladmindb_owner 고정 데이터베이스 역할의 멤버여야 합니다.User must be a member of the sysadmin fixed server role or the db_ddladmin and db_owner fixed database roles.

제한 사항Limitations and Restrictions

SQL 데이터 웨어하우스SQL Data Warehouse병렬 데이터 웨어하우스Parallel Data Warehouse, 다음을 만들 수 없습니다. and 병렬 데이터 웨어하우스Parallel Data Warehouse, you cannot create:

  • columnstore 인덱스가 이미 존재하는 경우 데이터 웨어하우스 테이블에 대한 클러스터형 또는 비클러스터형 rowstore 인덱스.A clustered or nonclustered rowstore index on a data warehouse table when a columnstore index already exists. 이 동작은 rowstore와 columnstore 인덱스가 같은 테이블에 공존할 수 있게 해주는 SMP SQL ServerSQL Server와 다릅니다.This behavior is different from SMP SQL ServerSQL Server which allows both rowstore and columnstore indexes to co-exist on the same table.
  • 뷰에서 인덱스를 만들 수 없습니다.You cannot create an index on a view.

메타데이터Metadata

기존 인덱스에 대한 자세한 정보를 보려면 sys.indexes (Transact-SQL) 카탈로그 뷰를 쿼리할 수 있습니다.To view information on existing indexes, you can query the sys.indexes (Transact-SQL) catalog view.

버전 참고 사항Version Notes

SQL 데이터베이스SQL Database는 파일 그룹 및 파일 스트림 옵션을 지원하지 않습니다. does not support filegroup and filestream options.

예: 모든 버전.Examples: All versions. AdventureWorks 데이터베이스를 사용합니다.Uses the AdventureWorks database.

1.A. 간단한 비클러스터형 rowstore 인덱스 만들기Create a simple nonclustered rowstore index

다음 예제에서는 Purchasing.ProductVendor 테이블의 VendorID 열에 비클러스터형 인덱스를 만듭니다.The following examples create a nonclustered index on the VendorID column of the Purchasing.ProductVendor table.

CREATE INDEX IX_VendorID ON ProductVendor (VendorID);  
CREATE INDEX IX_VendorID ON dbo.ProductVendor (VendorID DESC, Name ASC, Address DESC);  
CREATE INDEX IX_VendorID ON Purchasing..ProductVendor (VendorID);  

2.B. 간단한 비클러스터형 rowstore 복합 인덱스 만들기Create a simple nonclustered rowstore composite index

다음 예제에서는 Sales.SalesPerson 테이블의 SalesQuotaSalesYTD 열에 비클러스터형 복합 인덱스를 만듭니다.The following example creates a nonclustered composite index on the SalesQuota and SalesYTD columns of the Sales.SalesPerson table.

CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD);  

3.C. 다른 데이터베이스의 테이블에 인덱스 만들기Create an index on a table in another database

다음 예제에서는 Purchasing 데이터베이스에 있는 ProductVendor 테이블의 VendorID 열에 비클러스터형 인덱스를 만듭니다.The following example creates a non-clustered index on the VendorID column of the ProductVendor table in the Purchasing database.

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID ON Purchasing..ProductVendor (VendorID);   

4.D. 인덱스에 열 추가Add a column to an index

다음 예제에서는 dbo.FactFinance 테이블의 열 2개를 사용하여 IX_FF 인덱스를 만듭니다.The following example creates index IX_FF with two columns from the dbo.FactFinance table. 다음 명령문은 하나 이상의 열을 포함한 인덱스를 다시 만들며 기존 이름을 유지합니다.The next statement rebuilds the index with one more column and keeps the existing name.

CREATE INDEX IX_FF ON dbo.FactFinance ( FinanceKey ASC, DateKey ASC );  

--Rebuild and add the OrganizationKey  
CREATE INDEX IX_FF ON dbo.FactFinance ( FinanceKey, DateKey, OrganizationKey DESC)  
WITH ( DROP_EXISTING = ON );  

예제: SQL Server, Azure SQL DatabaseExamples: SQL Server, Azure SQL Database

5.E. 고유한 비클러스터형 인덱스 만들기Create a unique nonclustered index

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스에 있는 Name 테이블의 Production.UnitMeasure 열에 고유한 비클러스터형 인덱스를 만듭니다.The following example creates a unique nonclustered index on the Name column of the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. 인덱스는 Name 열에 삽입된 데이터의 고유성을 강제 적용합니다.The index will enforce uniqueness on the data inserted into the Name column.

CREATE UNIQUE INDEX AK_UnitMeasure_Name   
    ON Production.UnitMeasure(Name);  

다음 쿼리는 기존 행과 동일한 값을 가진 행을 삽입하여 고유성 제약 조건을 테스트합니다.The following query tests the uniqueness constraint by attempting to insert a row with the same value as that in an existing row.

--Verify the existing value.  
SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces';  
GO  
INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)  
    VALUES ('OC', 'Ounces', GetDate());  

결과 오류 메시지는 다음과 같습니다.The resulting error message is:

Server: Msg 2601, Level 14, State 1, Line 1  
Cannot insert duplicate key row in object 'UnitMeasure' with unique index 'AK_UnitMeasure_Name'. The statement has been terminated.  

6.F. IGNORE_DUP_KEY 옵션 사용Use the IGNORE_DUP_KEY option

다음 예에서는 IGNORE_DUP_KEY 옵션을 먼저 ON으로 설정한 후 다시 OFF로 설정한 상태에서 여러 행을 임시 테이블에 삽입했을 때 미치는 영향을 보여 줍니다.The following example demonstrates the effect of the IGNORE_DUP_KEY option by inserting multiple rows into a temporary table first with the option set to ON and again with the option set to OFF. 두 번째 여러 행 #Test 문이 실행될 때 의도적으로 중복 값을 발생시키는 INSERT 테이블에 단일 행을 삽입합니다.A single row is inserted into the #Test table that will intentionally cause a duplicate value when the second multiple-row INSERT statement is executed. 테이블의 행 수가 삽입된 행 수를 반환합니다.A count of rows in the table returns the number of rows inserted.

CREATE TABLE #Test (C1 nvarchar(10), C2 nvarchar(50), C3 datetime);  
GO  
CREATE UNIQUE INDEX AK_Index ON #Test (C2)  
    WITH (IGNORE_DUP_KEY = ON);  
GO  
INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());  
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;  
GO  
SELECT COUNT(*)AS [Number of rows] FROM #Test;  
GO  
DROP TABLE #Test;  
GO  

두 번째 INSERT 문의 결과는 다음과 같습니다.Here are the results of the second INSERT statement.

Server: Msg 3604, Level 16, State 1, Line 5 Duplicate key was ignored.  

Number of rows   
--------------   
38  

고유성 제약 조건을 위반하지 않은 Production.UnitMeasure 테이블에서 삽입된 행이 성공적으로 삽입되었습니다.Notice that the rows inserted from the Production.UnitMeasure table that did not violate the uniqueness constraint were successfully inserted. 경고가 발생하고 중복된 행이 무시되었지만 전체 트랜잭션은 롤백되지 않았습니다.A warning was issued and the duplicate row ignored, but the entire transaction was not rolled back.

같은 문이 다시 실행되지만 IGNORE_DUP_KEYOFF로 설정한 상태입니다.The same statements are executed again, but with IGNORE_DUP_KEY set to OFF.

CREATE TABLE #Test (C1 nvarchar(10), C2 nvarchar(50), C3 datetime);  
GO  
CREATE UNIQUE INDEX AK_Index ON #Test (C2)  
    WITH (IGNORE_DUP_KEY = OFF);  
GO  
INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());  
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;  
GO  
SELECT COUNT(*)AS [Number of rows] FROM #Test;  
GO  
DROP TABLE #Test;  
GO  

두 번째 INSERT 문의 결과는 다음과 같습니다.Here are the results of the second INSERT statement.

Server: Msg 2601, Level 14, State 1, Line 5  
Cannot insert duplicate key row in object '#Test' with unique index  
'AK_Index'. The statement has been terminated.  

Number of rows   
--------------   
1  

Production.UnitMeasure 테이블에서 오직 한 행만 UNIQUE 인덱스 제약 조건을 위반했지만 이 테이블에서 어떤 행도 삽입되지 않았습니다.Notice that none of the rows from the Production.UnitMeasure table were inserted into the table even though only one row in the table violated the UNIQUE index constraint.

7.G. DROP_EXISTING을 사용하여 인덱스 삭제 및 다시 만들기Using DROP_EXISTING to drop and re-create an index

다음 예에서는 ProductID 옵션을 사용하여 AdventureWorks2012AdventureWorks2012 데이터베이스에 있는 Production.WorkOrder 테이블의 DROP_EXISTING 열에서 기존 인덱스를 삭제하고 다시 만듭니다.The following example drops and re-creates an existing index on the ProductID column of the Production.WorkOrder table in the AdventureWorks2012AdventureWorks2012 database by using the DROP_EXISTING option. FILLFACTORPAD_INDEX 옵션도 설정됩니다.The options FILLFACTOR and PAD_INDEX are also set.

CREATE NONCLUSTERED INDEX IX_WorkOrder_ProductID  
    ON Production.WorkOrder(ProductID)  
    WITH (FILLFACTOR = 80,  
        PAD_INDEX = ON,  
        DROP_EXISTING = ON);  
GO  

8.H. 뷰에 인덱스 만들기Create an index on a view

다음 예에서는 뷰를 만들고 이 뷰에 인덱스를 만듭니다.The following example creates a view and an index on that view. 인덱싱된 뷰를 사용하는 두 개의 쿼리가 포함되어 있습니다.Two queries are included that use the indexed view.

--Set the options to support indexed views.  
SET NUMERIC_ROUNDABORT OFF;  
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,  
    QUOTED_IDENTIFIER, ANSI_NULLS ON;  
GO  
--Create view with schemabinding.  
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL  
DROP VIEW Sales.vOrders ;  
GO  
CREATE VIEW Sales.vOrders  
WITH SCHEMABINDING  
AS  
    SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Revenue,  
        OrderDate, ProductID, COUNT_BIG(*) AS COUNT  
    FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o  
    WHERE od.SalesOrderID = o.SalesOrderID  
    GROUP BY OrderDate, ProductID;  
GO  
--Create an index on the view.  
CREATE UNIQUE CLUSTERED INDEX IDX_V1   
    ON Sales.vOrders (OrderDate, ProductID);  
GO  
--This query can use the indexed view even though the view is   
--not specified in the FROM clause.  
SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev,   
    OrderDate, ProductID  
FROM Sales.SalesOrderDetail AS od  
    JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID  
        AND ProductID BETWEEN 700 and 800  
        AND OrderDate >= CONVERT(datetime,'05/01/2002',101)  
GROUP BY OrderDate, ProductID  
ORDER BY Rev DESC;  
GO  
--This query can use the above indexed view.  
SELECT  OrderDate, SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev  
FROM Sales.SalesOrderDetail AS od  
    JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID  
        AND DATEPART(mm,OrderDate)= 3  
        AND DATEPART(yy,OrderDate) = 2002  
GROUP BY OrderDate  
ORDER BY OrderDate ASC;  
GO  

9.I. (키가 아닌) 포함 열이 있는 인덱스 만들기Create an index with included (non-key) columns

다음 예에서는 1개의 키 열(PostalCode)과 4개의 키가 아닌 열(AddressLine1, AddressLine2, City, StateProvinceID)이 있는 비클러스터형 인덱스를 만듭니다.The following example creates a nonclustered index with one key column (PostalCode) and four non-key columns (AddressLine1, AddressLine2, City, StateProvinceID). 인덱스에서 처리하는 쿼리가 이어집니다.A query that is covered by the index follows. 쿼리 최적화 프로그램에서 선택한 인덱스를 표시하려면 쿼리를 실행하기 전에 SQL Server Management StudioSQL Server Management Studio쿼리 메뉴에서 실제 실행 계획 표시를 선택합니다.To display the index that is selected by the query optimizer, on the Query menu in SQL Server Management StudioSQL Server Management Studio, select Display Actual Execution Plan before executing the query.

CREATE NONCLUSTERED INDEX IX_Address_PostalCode  
    ON Person.Address (PostalCode)  
    INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);  
GO  
SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode  
FROM Person.Address  
WHERE PostalCode BETWEEN N'98000' and N'99999';  
GO  

10.J. 분할된 인덱스 만들기Create a partitioned index

다음은 AdventureWorks2012AdventureWorks2012 데이터베이스에 있는 기존 파티션 구성표인 TransactionsPS1에 분할된 비클러스터형 인덱스를 만드는 예입니다.The following example creates a nonclustered partitioned index on TransactionsPS1, an existing partition scheme in the AdventureWorks2012AdventureWorks2012 database. 이 예에서는 분할된 인덱스 샘플이 설치되었다고 가정합니다.This example assumes the partitioned index sample has been installed.

적용 대상: SQL Server 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017Azure SQL 데이터베이스Azure SQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Azure SQL 데이터베이스Azure SQL Database.

CREATE NONCLUSTERED INDEX IX_TransactionHistory_ReferenceOrderID  
    ON Production.TransactionHistory (ReferenceOrderID)  
    ON TransactionsPS1 (TransactionDate);  
GO  

11.K. 필터링된 인덱스 만들기Creating a filtered index

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스의 Production.BillOfMaterials 테이블에 필터링된 인덱스를 만듭니다.The following example creates a filtered index on the Production.BillOfMaterials table in the AdventureWorks2012AdventureWorks2012 database. 필터 조건자는 필터링된 인덱스에 키 열이 아닌 열을 포함할 수 있습니다.The filter predicate can include columns that are not key columns in the filtered index. 이 예에서 조건자는 EndDate가 NULL이 아닌 행만 선택합니다.The predicate in this example selects only the rows where EndDate is non-NULL.

CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithEndDate"  
    ON Production.BillOfMaterials (ComponentID, StartDate)  
    WHERE EndDate IS NOT NULL;  

12.L. 압축 인덱스 만들기Create a compressed index

다음 예에서는 행 압축을 사용하여 분할되지 않은 테이블에 인덱스를 만듭니다.The following example creates an index on a nonpartitioned table by using row compression.

CREATE NONCLUSTERED INDEX IX_INDEX_1   
    ON T1 (C2)  
WITH ( DATA_COMPRESSION = ROW ) ;   
GO  

다음 예에서는 인덱스의 모든 파티션에서 행 압축을 사용하여 분할된 테이블에 인덱스를 만듭니다.The following example creates an index on a partitioned table by using row compression on all partitions of the index.

CREATE CLUSTERED INDEX IX_PartTab2Col1  
ON PartitionTable1 (Col1)  
WITH ( DATA_COMPRESSION = ROW ) ;  
GO  

다음 예에서는 인덱스의 1 파티션에서 페이지 압축을 사용하고 2-4 파티션에서 행 압축을 사용하여 분할된 테이블에 인덱스를 만듭니다.The following example creates an index on a partitioned table by using page compression on partition 1 of the index and row compression on partitions 2 through 4 of the index.

CREATE CLUSTERED INDEX IX_PartTab2Col1  
ON PartitionTable1 (Col1)  
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1),  
    DATA_COMPRESSION = ROW ON PARTITIONS (2 TO 4 ) ) ;  
GO  

예제: Azure SQL 데이터 웨어하우스Azure SQL Data Warehouse병렬 데이터 웨어하우스Parallel Data WarehouseExamples: Azure SQL 데이터 웨어하우스Azure SQL Data Warehouse and 병렬 데이터 웨어하우스Parallel Data Warehouse

13.M. 기본 구문Basic syntax

CREATE INDEX IX_VendorID   
    ON ProductVendor (VendorID);  
CREATE INDEX IX_VendorID   
    ON dbo.ProductVendor (VendorID DESC, Name ASC, Address DESC);  
CREATE INDEX IX_VendorID   
    ON Purchasing..ProductVendor (VendorID);  

14.N. 현재 데이터베이스의 테이블에 비클러스터형 인덱스 만들기Create a non-clustered index on a table in the current database

다음 예제에서는 ProductVendor 테이블의 VendorID 열에 비클러스터형 인덱스를 만듭니다.The following example creates a non-clustered index on the VendorID column of the ProductVendor table.

CREATE INDEX IX_ProductVendor_VendorID   
    ON ProductVendor (VendorID);   

15.O. 다른 데이터베이스의 테이블에 클러스터형 인덱스 만들기Create a clustered index on a table in another database

다음 예제에서는 Purchasing 데이터베이스에 있는 ProductVendor 테이블의 VendorID 열에 비클러스터형 인덱스를 만듭니다.The following example creates a non-clustered index on the VendorID column of the ProductVendor table in the Purchasing database.

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID   
    ON Purchasing..ProductVendor (VendorID);   

참고 항목See Also

SQL Server 인덱스 디자인 가이드 SQL Server Index Design Guide
인덱스 및 ALTER TABLE Indexes and ALTER TABLE
ALTER INDEX(Transact-SQL) ALTER INDEX (Transact-SQL)
CREATE PARTITION FUNCTION(Transact-SQL) CREATE PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME(Transact-SQL) CREATE PARTITION SCHEME (Transact-SQL)
CREATE SPATIAL INDEX (Transact-SQL) CREATE SPATIAL INDEX (Transact-SQL)
CREATE STATISTICS(Transact-SQL) CREATE STATISTICS (Transact-SQL)
CREATE TABLE(Transact-SQL) CREATE TABLE (Transact-SQL)
CREATE XML INDEX (Transact-SQL) CREATE XML INDEX (Transact-SQL)
데이터 형식(Transact-SQL) Data Types (Transact-SQL)
DBCC SHOW_STATISTICS(Transact-SQL) DBCC SHOW_STATISTICS (Transact-SQL)
DROP INDEX (Transact-SQL) DROP INDEX (Transact-SQL)
XML 인덱스(SQL Server) XML Indexes (SQL Server)
sys.indexes(Transact-SQL) sys.indexes (Transact-SQL)
sys.index_columns(Transact-SQL) sys.index_columns (Transact-SQL)
sys.xml_indexes(Transact-SQL) sys.xml_indexes (Transact-SQL)
EVENTDATA(Transact-SQL)EVENTDATA (Transact-SQL)