클러스터형 및 비클러스터형 인덱스

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

인덱스는 테이블 또는 뷰에서 행 검색 속도를 높일 수 있는 테이블 또는 뷰와 연결된 디스크 내 구조입니다. 인덱스에는 테이블이나 뷰에 있는 하나 이상의 열로 작성되는 키가 포함됩니다. 이러한 키는 SQL Server가 키 값과 연결된 행 또는 행을 빠르고 효율적으로 찾을 수 있도록 하는 구조체(B-트리)에 저장됩니다.

참고 항목

SQL Server 설명서는 인덱스를 지칭할 때 B-트리라는 용어를 사용합니다. rowstore 인덱스에서 SQL Server는 B+ 트리를 구현합니다. 이는 columnstore 인덱스나 메모리 내 데이터 저장소에는 적용되지 않습니다. 자세한 내용은 SQL Server 및 Azure SQL 인덱스 아키텍처 및 디자인 가이드를 참조 하세요.

테이블 또는 뷰에는 다음과 같은 유형의 인덱스가 포함될 수 있습니다.

  • 클러스터형

    • 클러스터형 인덱스는 해당 키 값을 기반으로 테이블이나 뷰의 데이터 행을 정렬하고 저장합니다. 이러한 키 값은 인덱스 정의에 포함된 열입니다. 데이터 행 자체는 한 가지 순서로만 저장될 수 있으므로 테이블당 클러스터형 인덱스는 하나만 있을 수 있습니다.  
    • 테이블의 데이터 행이 정렬된 순서로 저장될 때만 테이블에 클러스터형 인덱스가 포함됩니다. 테이블에 클러스터형 인덱스가 있는 경우 테이블을 클러스터형 테이블이라고 합니다. 테이블에 클러스터형 인덱스가 없는 경우 해당 데이터 행은 힙이라는 순서가 지정되지 않은 구조에 저장됩니다.
  • 비클러스터형 인덱스

    • 비클러스터형 인덱스에는 데이터 행과 별개의 구조가 있습니다. 비클러스터형 인덱스에는 비클러스터형 인덱스 키 값이 포함되며 각 키 값 항목에는 키 값이 포함된 데이터 행에 대한 포인터가 있습니다.

    • 비클러스터형 인덱스에서 데이터 행에 대한 인덱스 행의 포인터를 행 로케이터라고 합니다. 행 로케이터의 구조는 데이터 페이지가 힙 또는 클러스터형 테이블에 저장되는지 여부에 따라 달라집니다. 힙의 경우 행 로케이터는 행에 대한 포인터입니다. 클러스터형 테이블의 경우 행 로케이터는 클러스터형 인덱스 키입니다.

    • 키가 아닌 열을 비클러스터형 인덱스의 리프 수준에 추가하여 기존 인덱스 키 제한을 바이패스하고 완전히 적용된 인덱싱된 쿼리를 실행할 수 있습니다. 자세한 내용은 포괄 열을 사용하여 인덱스 만들기를 참조하세요. 인덱스 키 제한에 대한 자세한 내용은 SQL Server의 최대 용량 사양을 참조하세요.

클러스터형 인덱스와 비클러스터형 인덱스는 모두 고유할 수 있습니다. 고유 인덱스를 사용하면 두 행이 인덱스 키에 대해 동일한 값을 가질 수 없습니다. 그렇지 않으면 인덱스가 고유하지 않으며 여러 행이 동일한 키 값을 공유할 수 있습니다. 자세한 내용은 고유 인덱스 만들기를 참조하세요.

테이블 데이터가 수정될 때마다 테이블이나 뷰에 대한 인덱스가 자동으로 유지 관리됩니다.

더 많은 유형의 특수 용도 인덱스는 인덱스를 참조하세요.

인덱스 및 제약 조건

테이블 열에 PRIMARY KEY 및 UNIQUE 제약 조건이 정의되면 SQL Server에서 자동으로 인덱스를 만듭니다. 예를 들어 UNIQUE 제약 조건이 있는 테이블을 만들 때 데이터베이스 엔진 비클러스터형 인덱스가 자동으로 만들어집니다. PRIMARY KEY를 구성하는 경우 클러스터형 인덱스가 아직 없는 한 데이터베이스 엔진 자동으로 클러스터형 인덱스를 만듭니다. 기존 테이블에 PRIMARY KEY 제약 조건을 적용하려고 하고 해당 테이블에 클러스터형 인덱스가 이미 있는 경우 SQL Server는 비클러스터형 인덱스를 사용하여 기본 키를 적용합니다.

자세한 내용은 기본 키 만들기고유 제약 조건 만들기를 참조하세요.

쿼리 최적화 프로그램에서 인덱스를 사용하는 방법

잘 디자인된 인덱스는 디스크 I/O 작업을 줄이고 시스템 리소스를 더 적게 사용할 수 있습니다. 따라서 이러한 인덱스는 쿼리 성능을 향상시킵니다. 인덱스는 SELECT, UPDATE, DELETE 또는 MERGE 문을 포함하는 다양한 쿼리에 유용할 수 있습니다. 데이터베이스의 쿼리 SELECT JobTitle, HireDate FROM HumanResources.Employee WHERE BusinessEntityID = 250 를 고려합니다 AdventureWorks2022 . 이 쿼리가 실행되면 쿼리 최적화 프로그램은 데이터를 검색하는 데 사용할 수 있는 각 메서드를 평가하고 가장 효율적인 방법을 선택합니다. 이 메서드는 테이블 검색이거나 하나 이상의 인덱스(있는 경우)를 검색할 수 있습니다.

테이블 검색 중에 쿼리 최적화 프로그램은 테이블의 모든 행을 읽고 쿼리 조건을 충족하는 행을 추출합니다. 테이블 검색은 많은 디스크 I/O 작업을 생성하며 리소스를 많이 사용할 수 있습니다. 그러나 예를 들어 쿼리 결과 집합의 행이 테이블에서 높은 비율을 차지할 경우 테이블 검색이 가장 효율적인 방법일 수 있습니다.

쿼리 최적화 프로그램에서 인덱스를 사용하는 경우 인덱스 키 열을 검색하고, 쿼리에 필요한 행의 스토리지 위치를 찾고, 해당 위치에서 일치하는 행을 추출합니다. 일반적으로 인덱스 검색은 테이블을 검색하는 것보다 훨씬 빠릅니다. 테이블과 달리 인덱스에는 행당 열이 거의 없는 경우가 많으며 행은 정렬된 순서로 표시됩니다.

쿼리 최적화 프로그램은 일반적으로 쿼리 실행 시 가장 효율적인 방법을 선택합니다. 그러나 사용 가능한 인덱스가 없을 경우 쿼리 최적화 프로그램은 테이블 검색을 사용해야 합니다. 쿼리 최적화 프로그램에서 선택할 효율적인 인덱스를 선택할 수 있도록 환경에 가장 적합한 인덱스를 디자인하고 만드는 것이 작업입니다. SQL Server는 데이터베이스 환경 분석 및 적절한 인덱스 선택에 도움이 되는 데이터베이스 엔진 튜닝 관리자 제공합니다.

Important

인덱스 디자인 지침 및 내부 사항에 대한 자세한 내용은 SQL Server 및 Azure SQL 인덱스 아키텍처 및 디자인 가이드를 참조 하세요.

다음 단계