클러스터형 인덱스 만들기Create Clustered Indexes

이 항목 적용 대상: 예SQL Server예Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

SQL Server Management StudioSQL Server Management Studio 또는 Transact-SQLTransact-SQL을 사용하여 테이블에 클러스터형 인덱스를 만들 수 있습니다.You can create clustered indexes on tables by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL. 몇 가지 경우를 제외하고 모든 테이블에는 클러스터형 인덱스가 있어야 합니다.With few exceptions, every table should have a clustered index. 쿼리 성능을 향상시키는 것 외에도 요청 시 클러스터형 인덱스를 다시 작성하거나 다시 구성하여 테이블 조각화를 제어할 수 있습니다.Besides improving query performance, a clustered index can be rebuilt or reorganized on demand to control table fragmentation. 뷰에서 클러스터형 인덱스를 만들 수도 있습니다.A clustered index can also be created on a view. 클러스터형된 인덱스는 클러스터형 및 비클러스터형 인덱스 소개항목에 정의되어 있습니다.(Clustered indexes are defined in the topic Clustered and Nonclustered Indexes Described.)

항목 내용In This Topic

시작하기 전에Before You Begin

일반적인 구현 방법Typical Implementations

클러스터형 인덱스는 다음과 같은 방법으로 구현됩니다.Clustered indexes are implemented in the following ways:

  • PRIMARY KEY 및 UNIQUE 제약 조건PRIMARY KEY and UNIQUE constraints

    PRIMARY KEY 제약 조건을 만들 때 테이블에 클러스터형 인덱스가 없으며 고유 비클러스터형 인덱스를 지정하지 않은 경우 열에 고유 클러스터형 인덱스가 자동으로 생성됩니다.When you create a PRIMARY KEY constraint, a unique clustered index on the column or columns is automatically created if a clustered index on the table does not already exist and you do not specify a unique nonclustered index. 기본 키 열에는 NULL 값이 허용되지 않습니다.The primary key column cannot allow NULL values.

    UNIQUE 제약 조건을 만들면 고유 비클러스터형 인덱스가 생성되어 기본적으로 UNIQUE 제약 조건을 적용합니다.When you create a UNIQUE constraint, a unique nonclustered index is created to enforce a UNIQUE constraint by default. 테이블에 클러스터형 인덱스가 없는 경우 고유 클러스터형 인덱스를 지정할 수 있습니다.You can specify a unique clustered index if a clustered index on the table does not already exist.

    제약 조건의 일부로 생성된 인덱스에는 제약 조건 이름과 같은 이름이 자동으로 지정됩니다.An index created as part of the constraint is automatically given the same name as the constraint name. 자세한 내용은 Primary and Foreign Key ConstraintsUnique Constraints and Check Constraints를 참조하세요.For more information, see Primary and Foreign Key Constraints and Unique Constraints and Check Constraints.

  • 제약 조건의 영향을 받지 않는 인덱스Index independent of a constraint

    비클러스터형 PRIMARY KEY 제약 조건이 지정된 경우 기본 키 열이 아닌 열의 클러스터형 인덱스를 만들 수 있습니다.You can create a clustered index on a column other than primary key column if a nonclustered primary key constraint was specified.

제한 사항Limitations and Restrictions

  • 클러스터형 인덱스 구조를 만들 때는 각 파일과 파일 그룹에서 기존(원본) 구조와 새(대상) 구조를 위한 디스크 공간이 모두 필요합니다.When a clustered index structure is created, disk space for both the old (source) and new (target) structures is required in their respective files and filegroups. 기존 구조는 인덱스 생성 트랜잭션이 커밋된 후 할당 취소됩니다.The old structure is not deallocated until the complete transaction commits. 정렬에 사용할 임시 디스크 공간이 추가로 필요할 수도 있습니다.Additional temporary disk space for sorting may also be required. 자세한 내용은 Disk Space Requirements for Index DDL Operations을 참조하세요.For more information, see Disk Space Requirements for Index DDL Operations.

  • 기존의 비클러스터형 인덱스를 여러 개 포함하는 힙에 클러스터형 인덱스를 만들 때는 RID(행 식별자) 대신 클러스터링 키 값을 포함하도록 모든 비클러스터형 인덱스를 다시 작성해야 합니다.If a clustered index is created on a heap with several existing nonclustered indexes, all the nonclustered indexes must be rebuilt so that they contain the clustering key value instead of the row identifier (RID). 마찬가지로 비클러스터형 인덱스가 여러 개 있는 테이블에서 클러스터형 인덱스를 삭제하면 DROP 작업의 일부로 비클러스터형 인덱스가 모두 다시 작성됩니다.Similarly, if a clustered index is dropped on a table that has several nonclustered indexes, the nonclustered indexes are all rebuilt as part of the DROP operation. 대형 테이블에서는 이 작업을 수행하는 데 시간이 오래 걸립니다.This may take significant time on large tables.

    대형 테이블에 인덱스를 만들 경우 클러스터형 인덱스로 시작하고 비클러스터형 인덱스를 작성하는 것이 좋습니다.The preferred way to build indexes on large tables is to start with the clustered index and then build any nonclustered indexes. 기존 테이블에 인덱스를 만들 때는 ONLINE 옵션을 ON으로 설정하는 것이 좋습니다.Consider setting the ONLINE option to ON when you create indexes on existing tables. 이 옵션을 ON으로 설정하면 장기 테이블 잠금이 보유되지 않습니다.When set to ON, long-term table locks are not held. 따라서 기본 테이블에 대한 쿼리나 업데이트를 계속할 수 있습니다.This enables queries or updates to the underlying table to continue. 자세한 내용은 Perform Index Operations Online을 참조하세요.For more information, see Perform Index Operations Online.

  • 클러스터형 인덱스의 인덱스 키는 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. 행 오버플로 데이터가 포함될 수 있는 테이블에 대한 정보를 얻으려면 sys.dm_db_index_physical_stats(Transact-SQL) 동적 관리 함수를 사용합니다.To obtain information about tables that might contain row-overflow data, use the sys.dm_db_index_physical_stats (Transact-SQL) dynamic management function.

보안Security

사용 권한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.

SQL Server Management Studio 사용Using SQL Server Management Studio

개체 탐색기를 사용하여 클러스터형 인덱스를 만들려면To create a clustered index by using Object Explorer

  1. 개체 탐색기에서 클러스터형 인덱스를 만들 테이블을 확장합니다.In Object Explorer, expand the table on which you want to create a clustered index.

  2. 인덱스 폴더를 마우스 오른쪽 단추로 클릭하고 새 인덱스를 가리킨 다음 클러스터형 인덱스...를 선택합니다.Right-click the Indexes folder, point to New Index, and select Clustered Index….

  3. 새 인덱스 대화 상자의 일반 페이지에서 인덱스 이름 상자에 새 인덱스의 이름을 입력합니다.In the New Index dialog box, on the General page, enter the name of the new index in the Index name box.

  4. 인덱스 키 열아래에서 추가...를 클릭합니다.Under Index key columns, click Add….

  5. table_name에서 열 선택 대화 상자에서 클러스터형 인덱스에 추가할 테이블 열의 확인란을 선택합니다.In the Select Columns fromtable_name dialog box, select the check box of the table column to be added to the clustered index.

  6. 확인을 클릭합니다.Click OK.

  7. 새 인덱스 대화 상자에서 확인을 클릭합니다.In the New Index dialog box, click OK.

테이블 디자이너를 사용하여 클러스터형 인덱스를 만들려면To create a clustered index by using the Table Designer

  1. 개체 탐색기에서 클러스터형 인덱스를 사용하여 테이블을 만들 데이터베이스를 확장합니다.In Object Explorer, expand the database on which you want to create a table with a clustered index.

  2. 테이블 폴더를 마우스 오른쪽 단추로 클릭하고 새 테이블…을 클릭합니다.Right-click the Tables folder and click New Table….

  3. 늘 하던 방식대로 새 테이블을 만듭니다.Create a new table as you normally would. 자세한 내용은 테이블 만들기(데이터베이스 엔진)를 참조하세요.For more information, see Create Tables (Database Engine).

  4. 위에서 만든 새 테이블을 마우스 오른쪽 단추로 클릭하고 디자인을 클릭합니다.Right-click the new table created above and click Design.

  5. 테이블 디자이너 메뉴에서 인덱스/키를 클릭합니다.On the Table Designer menu, click Indexes/Keys.

  6. 인덱스/키 대화 상자에서 추가를 클릭합니다.In the Indexes/Keys dialog box, click Add.

  7. 선택한 기본/고유 키 또는 인덱스 입력란에서 새 인덱스를 선택합니다.Select the new index in the Selected Primary/Unique Key or Index text box.

  8. 표에서 CLUSTERED로 만들기를 선택하고 속성 오른쪽에 있는 드롭다운 목록에서 를 선택합니다.In the grid, select Create as Clustered, and choose Yes from the drop-down list to the right of the property.

  9. 닫기를 클릭합니다.Click Close.

  10. 파일 메뉴에서 table name 저장을 클릭합니다.On the File menu, click Savetable_name.

Transact-SQL 사용Using Transact-SQL

클러스터형 인덱스를 만들려면To create a clustered index

  1. 개체 탐색기에서 데이터베이스 엔진Database Engine인스턴스에 연결합니다.In Object Explorer, connect to an instance of 데이터베이스 엔진Database Engine.

  2. 표준 도구 모음에서 새 쿼리를 클릭합니다.On the Standard bar, click New Query.

  3. 다음 예를 복사하여 쿼리 창에 붙여 넣고 실행을 클릭합니다.Copy and paste the following example into the query window and click Execute.

    USE AdventureWorks2012;  
    GO  
    -- Create a new table with three columns.  
    CREATE TABLE dbo.TestTable  
        (TestCol1 int NOT NULL,  
         TestCol2 nchar(10) NULL,  
         TestCol3 nvarchar(50) NULL);  
    GO  
    -- Create a clustered index called IX_TestTable_TestCol1  
    -- on the dbo.TestTable table using the TestCol1 column.  
    CREATE CLUSTERED INDEX IX_TestTable_TestCol1   
        ON dbo.TestTable (TestCol1);   
    GO  
    

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

관련 항목:See Also

기본 키 만들기 Create Primary Keys
UNIQUE 제약 조건 만들기Create Unique Constraints