다음을 통해 공유


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

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

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

참고 항목

설명서는 인덱스를 지칭할 때 B-트리라는 용어를 사용합니다. rowstore 인덱스에서 데이터베이스 엔진은 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 문을 포함하는 다양한 쿼리에 유용할 수 있습니다. AdventureWorks2022 데이터베이스에서 SELECT JobTitle, HireDate FROM HumanResources.Employee WHERE BusinessEntityID = 250 쿼리를 고려합니다. 이 쿼리가 실행되면 쿼리 최적화 프로그램은 데이터를 검색하는 데 사용할 수 있는 각 메서드를 평가하고 가장 효율적인 메서드를 선택합니다. 이 메서드는 테이블을 검색하거나 하나 이상의 인덱스(있는 경우)를 검색할 수 있습니다.

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

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

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

Important

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