클러스터형 및 비클러스터형 인덱스 소개Clustered and Nonclustered Indexes Described

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

이전 버전의 SQL Server와 관련 된 콘텐츠를 참조 하십시오. 클러스터형 및 비클러스터형 인덱스 설명합니다.For content related to previous versions of SQL Server, see Clustered and Nonclustered Indexes Described.

인덱스는 테이블이나 뷰와 관련된 디스크상 구조로서 테이블이나 뷰의 행 검색 속도를 향상시킵니다.An index is an on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. 인덱스에는 테이블이나 뷰에 있는 하나 이상의 열로 작성되는 키가 포함됩니다.An index contains keys built from one or more columns in the table or view. 이러한 키는 SQL ServerSQL Server 에서 키 값과 연결된 행을 빠르고 효율적으로 찾을 수 있는 구조(B-트리)에 저장됩니다.These keys are stored in a structure (B-tree) that enables SQL ServerSQL Server to find the row or rows associated with the key values quickly and efficiently.

테이블이나 뷰에 포함할 수 있는 인덱스 유형은 다음과 같습니다.A table or view can contain the following types of indexes:

  • 클러스터형Clustered

    • 클러스터형 인덱스는 해당 키 값을 기반으로 테이블이나 뷰의 데이터 행을 정렬하고 저장합니다.Clustered indexes sort and store the data rows in the table or view based on their key values. 인덱스 정의에 여러 열이 포함됩니다.These are the columns included in the index definition. 데이터 행 자체는 한 가지 순서로만 정렬될 수 있으므로 테이블당 클러스터형 인덱스는 하나만 있을 수 있습니다.There can be only one clustered index per table, because the data rows themselves can be sorted in only one order.

    • 테이블의 데이터 행이 정렬된 순서로 저장될 때만 테이블에 클러스터형 인덱스가 포함됩니다.The only time the data rows in a table are stored in sorted order is when the table contains a clustered index. 클러스터형 인덱스가 포함된 테이블을 클러스터형 테이블이라고 합니다.When a table has a clustered index, the table is called a clustered table. 테이블에 클러스터형 인덱스가 없으면 해당 데이터 행은 힙이라는 정렬되지 않은 _구조로 저장됩니다.If a table has no clustered index, its data rows are stored in an unordered structure called a heap.

  • 비클러스터형 인덱스Nonclustered

    • 비클러스터형 인덱스의 구조는 데이터 행으로부터 독립적입니다.Nonclustered indexes have a structure separate from the data rows. 비클러스터형 인덱스에는 비클러스터형 인덱스 키 값이 있으며 각 키 값 항목에는 해당 키 값이 포함된 데이터 행에 대한 포인터가 있습니다.A nonclustered index contains the nonclustered index key values and each key value entry has a pointer to the data row that contains the key value.

    • 비클러스터형 인덱스의 인덱스 행에서 데이터 행으로의 포인터를 행 로케이터라고 합니다.The pointer from an index row in a nonclustered index to a data row is called a row locator. 행 로케이터의 구조는 데이터 페이지가 힙에 저장되는지 아니면 클러스터형 테이블에 저장되는지에 따라 다릅니다.The structure of the row locator depends on whether the data pages are stored in a heap or a clustered table. 힙의 경우 행 로케이터는 행에 대한 포인터입니다.For a heap, a row locator is a pointer to the row. 클러스터형 테이블의 경우 행 로케이터는 클러스터형 인덱스 키입니다.For a clustered table, the row locator is the clustered index key.

    • 클러스터형 인덱스의 리프 수준에 키가 아닌 열을 추가하여 기존 키 제한을 무시하고 완전히 포괄되는 인덱싱된 쿼리를 실행할 수 있습니다.You can add nonkey columns to the leaf level of the nonclustered index to by-pass existing index key limits, and execute fully covered, indexed, queries. 자세한 내용은 Create Indexes with Included Columns을 참조하세요.For more information, see Create Indexes with Included Columns. 인덱스 키 제한에 대한 자세한 내용은 SQL Server의 최대 용량 사양을 참조하세요.For details about index key limits see Maximum Capacity Specifications for SQL Server.

    클러스터형 인덱스와 비클러스터형 인덱스 모두 고유 인덱스가 될 수 있습니다.Both clustered and nonclustered indexes can be unique. 이 경우 두 행에 인덱스 키에 대한 동일한 값이 있을 수 없습니다.This means no two rows can have the same value for the index key. 동일한 값이 있다면 인덱스는 고유하지 않으며 여러 행에서 동일한 키 값을 공유할 수 있습니다.Otherwise, the index is not unique and multiple rows can share the same key value. 자세한 내용은 고유 인덱스 만들기를 참조하세요.For more information, see Create Unique Indexes.

    테이블 데이터가 수정될 때마다 테이블이나 뷰에 대한 인덱스가 자동으로 유지 관리됩니다.Indexes are automatically maintained for a table or view whenever the table data is modified.

    다른 유형의 특수 목적 인덱스에 대한 자세한 내용은 Indexes 를 참조하십시오.See Indexes for additional types of special purpose indexes.

인덱스 및 제약 조건Indexes and Constraints

테이블 열에 PRIMARY KEY 및 UNIQUE 제약 조건을 정의하면 인덱스가 자동으로 생성됩니다.Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. 예를 들어 테이블을 만들고 특정 열을 기본 키로 지정하면 데이터베이스 엔진Database Engine 에서 자동으로 해당 열에 대한 인덱스와 PRIMARY KEY 제약 조건이 생성됩니다.For example, when you create a table and identify a particular column to be the primary key, the 데이터베이스 엔진Database Engine automatically creates a PRIMARY KEY constraint and index on that column. 자세한 내용은 Create Primary KeysCreate Unique Constraints를 참조하세요.For more information, see Create Primary Keys and Create Unique Constraints.

쿼리 최적화 프로그램의 인덱스 사용 방법How Indexes Are Used by the Query Optimizer

인덱스를 잘 디자인하면 디스크 I/O 작업과 시스템 리소스 사용을 줄일 수 있으므로 쿼리 성능이 향상됩니다.Well-designed indexes can reduce disk I/O operations and consume fewer system resources therefore improving query performance. 인덱스는 SELECT, UPDATE, DELETE 또는 MERGE 문을 포함하는 다양한 쿼리에 유용합니다.Indexes can be helpful for a variety of queries that contain SELECT, UPDATE, DELETE, or MERGE statements. SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 데이터베이스의 AdventureWorks2012AdventureWorks2012 을 예로 들어 보겠습니다.Consider the query SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250 in the AdventureWorks2012AdventureWorks2012 database. 이 쿼리가 실행될 때 쿼리 최적화 프로그램은 데이터 검색에 사용할 수 있는 각 방법을 평가하고 가장 효율적인 방법을 선택합니다.When this query is executed, the query optimizer evaluates each available method for retrieving the data and selects the most efficient method. 이때 테이블 검색이 선택될 수 있습니다. 가능한 경우 하나 이상의 인덱스 검색이 선택될 수도 있습니다.The method may be a table scan, or may be scanning one or more indexes if they exist.

테이블 검색을 수행할 때 쿼리 최적화 프로그램은 테이블의 모든 행을 읽고 쿼리 조건에 맞는 행을 추출합니다.When performing a table scan, the query optimizer reads all the rows in the table, and extracts the rows that meet the criteria of the query. 테이블 검색은 많은 디스크 I/O 작업을 생성하고 리소스를 많이 사용할 수 있습니다.A table scan generates many disk I/O operations and can be resource intensive. 그러나 예를 들어 쿼리 결과 집합의 행이 테이블에서 높은 비율을 차지할 경우 테이블 검색이 가장 효율적인 방법일 수 있습니다.However, a table scan could be the most efficient method if, for example, the result set of the query is a high percentage of rows from the table.

쿼리 최적화 프로그램은 인덱스 키 열을 검색하고 쿼리에 필요한 행의 저장 위치를 찾은 후 해당 위치에서 일치하는 행을 추출하는 방식으로 인덱스를 사용합니다.When the query optimizer uses an index, it searches the index key columns, finds the storage location of the rows needed by the query and extracts the matching rows from that location. 일반적으로 인덱스 검색이 테이블 검색보다 훨씬 빠릅니다. 이는 테이블과 달리 인덱스는 행당 열 수가 매우 적고 행이 정렬되기 때문입니다.Generally, searching the index is much faster than searching the table because unlike a table, an index frequently contains very few columns per row and the rows are in sorted order.

쿼리 최적화 프로그램은 일반적으로 쿼리 실행 시 가장 효율적인 방법을 선택합니다.The query optimizer typically selects the most efficient method when executing queries. 그러나 사용 가능한 인덱스가 없을 경우 쿼리 최적화 프로그램은 테이블 검색을 사용해야 합니다.However, if no indexes are available, the query optimizer must use a table scan. 쿼리 최적화 프로그램에서 선택할 수 있는 효율적인 인덱스가 충분하도록 하려면 환경에 가장 적합한 인덱스를 여러 개 디자인하고 만들어야 합니다.Your task is to design and create indexes that are best suited to your environment so that the query optimizer has a selection of efficient indexes from which to select. SQL ServerSQL Server 제공하는 데이터베이스 엔진 튜닝 관리자 를 사용하면 데이터베이스 환경을 분석하고 적절한 인덱스를 선택하는 데 도움이 됩니다. provides the Database Engine Tuning Advisor to help with the analysis of your database environment and in the selection of appropriate indexes.

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

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