다음을 통해 공유


클러스터형 인덱스 만들기

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

SQL Server 또는 Transact-SQL을 사용하여 테이블에서 클러스터형 인덱스를 만들 수 있습니다. 몇 가지 예외를 제외하고 모든 테이블에는 클러스터형 인덱스가 있어야 합니다. 쿼리 성능을 향상시키는 것 외에도 요청 시 클러스터형 인덱스를 다시 작성하거나 다시 구성하여 테이블 조각화를 제어할 수 있습니다. 클러스터형 인덱스도 보기에서 만들 수 있습니다. (클러스터형 인덱스는 클러스터형 및 비클러스터형 인덱스 문서에 정의되어 있습니다.)

일반적인 구현 방법

클러스터형 인덱스는 다음 방법으로 구현합니다.

  • PRIMARY KEY 및 UNIQUE 제약 조건

    PRIMARY KEY 제약 조건을 만들 때 테이블의 클러스터형 인덱스가 아직 없고 고유한 비클러스터형 인덱스를 지정하지 않으면 열 또는 열에 고유한 클러스터형 인덱스가 자동으로 만들어집니다. 기본 키 열은 NULL 값을 허용할 수 없습니다.

    UNIQUE 제약 조건을 만들면 기본적으로 UNIQUE 제약 조건을 적용하기 위해 고유한 비클러스터형 인덱스가 만들어집니다. 테이블에 클러스터형 인덱스가 없는 경우 고유 클러스터형 인덱스를 지정할 수 있습니다.

    제약 조건의 일부로 만든 인덱스는 제약 조건 이름과 동일한 이름을 자동으로 지정합니다. 자세한 정보는 기본 및 외래 키 제약 조건고유 제약 조건 및 검사 제약 조건을 참조하세요.

  • 제약 조건과 무관한 인덱스

    비클러스터형 PRIMARY KEY 제약 조건이 지정된 경우 기본 키 열이 아닌 열의 클러스터형 인덱스를 만들 수 있습니다.

제한 사항

  • 클러스터형 인덱스 구조가 생성되면 해당 파일과 파일 그룹에 기존(원본) 구조와 새(대상) 구조를 위한 디스크 공간이 모두 필요합니다. 이전 구조는 전체 트랜잭션이 커밋될 때까지 할당이 취소되지 않습니다. 정렬을 위한 추가 임시 디스크 공간도 필요할 수 있습니다. 자세한 내용은 인덱스 DDL 작업에 필요한 디스크 공간 요구 사항을 참조하세요.

  • 기존의 비클러스터형 인덱스를 여러 개 포함하는 힙에 클러스터형 인덱스를 만들 때는 RID(행 식별자) 대신 클러스터링 키 값을 포함하도록 모든 비클러스터형 인덱스를 다시 작성해야 합니다. 마찬가지로 클러스터형 인덱스가 여러 개의 비클러스터형 인덱스가 있는 테이블에 놓이면 비클러스터형 인덱스는 모두 DROP 작업의 일부로 다시 작성됩니다. 이 프로세스는 큰 테이블에서 상당한 시간이 걸릴 수 있습니다.

    큰 테이블에서 인덱스를 빌드하는 기본 방법은 클러스터형 인덱스로 시작한 다음 비클러스터형 인덱스를 빌드하는 것입니다. 기존 테이블에 인덱스를 만들 때 ONLINE 옵션을 ON으로 설정하는 것이 좋습니다. 이 옵션을 ON으로 설정하면 장기 테이블 잠금이 보유되지 않습니다. 따라서 기본 테이블에 대한 쿼리나 업데이트를 계속할 수 있습니다. 자세한 내용은 Perform Index Operations Online을 참조하세요.

  • 클러스터형 인덱스의 인덱스 키는 ROW_OVERFLOW_DATA 할당 단위에 기존 데이터가 있는 varchar 열을 포함할 수 없습니다. varchar 열에 대한 클러스터형 인덱스를 만들고 기존 데이터가 IN_ROW_DATA 할당 단위에 있는 경우에는 데이터를 행 외부로 밀어넣는 열에 대한 후속 삽입 또는 업데이트 동작이 실패합니다. 행-오버플로 데이터가 포함될 수 있는 테이블에 대한 정보를 얻으려면 sys.dm_db_index_physical_stats (Transact-SQL) 동적 관리 함수를 사용합니다.

사용 권한

테이블 또는 보기에 대한 ALTER 권한이 필요합니다. 사용자는 sysadmin 고정 서버 역할의 멤버 또는 db_ddladmindb_owner 고정 데이터베이스 역할의 멤버여야 합니다.

SQL Server Management Studio 사용

개체 탐색기 클러스터형 인덱스 만들기

  1. 개체 탐색기 클러스터형 인덱스 만들 테이블을 확장합니다.

  2. 인덱스 폴더를 마우스 오른쪽 단추로 클릭하고 새 인덱스를 가리킨 다음 클러스터형 인덱스...를 선택합니다.

  3. 새 인덱스 대화 상자의 일반 페이지에서 인덱스 이름 상자에 새 인덱스의 이름을 입력합니다.

  4. 인덱스 키 열 아래에서 추가...를 선택합니다.

  5. table_name에서 열 선택 대화 상자에서 클러스터형 인덱스에 추가할 테이블 열의 확인란을 선택합니다.

  6. 확인을 선택합니다.

  7. 새 인덱스 대화 상자에서 확인을 선택합니다.

테이블 디자이너를 사용하여 클러스터형 인덱스 만들기

  1. 개체 탐색기 클러스터형 인덱스가 있는 테이블을 만들 데이터베이스를 확장합니다.

  2. 테이블 폴더를 마우스 오른쪽 단추로 클릭하고 새 테이블…을 선택합니다.

  3. 평소와 같이 새 테이블을 만듭니다. 자세한 정보는 테이블 만들기(데이터베이스 엔진)을 참조하세요.

  4. 앞서 만든 새 테이블을 마우스 오른쪽 단추로 클릭하고 디자인을 선택합니다.

  5. 테이블 디자이너 메뉴에서 인덱스/키를 선택합니다.

  6. 인덱스/키 대화 상자에서 추가를 선택합니다.

  7. 선택한 기본/고유 키 또는 인덱스 입력란에서 새 인덱스를 선택합니다.

  8. 표에서 CLUSTERED로 만들기를 선택하고 속성 오른쪽에 있는 드롭다운 목록에서 를 선택합니다.

  9. 닫기를 선택합니다.

  10. 파일 메뉴에서 table_name 저장을 선택합니다.

Transact-SQL 사용

  1. 개체 탐색기에서 데이터베이스 엔진인스턴스에 연결합니다.

  2. 표준 도구 모음에서 새 쿼리를 선택합니다.

  3. 다음 예제를 복사하여 쿼리 창에 붙여넣고 실행을 선택합니다.

    USE AdventureWorks2022;
    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)를 참조하세요.