다음을 통해 공유


누락된 인덱스 정보를 사용하여 CREATE INDEX 문 작성

이 항목에서는 누락된 인덱스 기능 구성 요소에서 반환된 정보를 사용하여 누락된 인덱스에 대한 CREATE INDEX 문을 작성하는 방법에 대한 지침과 예를 제공합니다.

CREATE INDEX 문의 열 정렬

누락된 인덱스 기능의 구성 요소는 출력에서 같음, 같지 않음 및 포괄 열을 표시합니다.

예를 들어 XML 실행 계획의 MissingIndexes 요소는 인덱스 키 열이 Transact-SQL 문 조건자의 같음(=)이나 같지 않음(<, > 등)에 사용되는지 또는 단순히 쿼리를 처리하기 위해 포함되는지를 나타냅니다. 이 정보는 ColumnGroup 하위 요소의 Usage 특성에 대한 다음 값 중 하나로 표시됩니다.

<ColumnGroup Usage="EQUALITY">

<ColumnGroup Usage="INEQUALITY">

<ColumnGroup Usage="INCLUDE">

동적 관리 개체 sys.dm_db_missing_index_details 및 sys.dm_db_missing_index_columns는 인덱스 키 열이 같음, 같지 않음 또는 포괄 열인지를 나타내는 결과를 반환합니다. sys.dm_db_missing_index_details의 결과 집합은 이 정보를 equality_columns, inequality_columns 및 included_columns 열에 반환합니다. sys.dm_db_missing_index_columns가 반환되는 결과 집합은 이 정보를 column_usage 열에 반환합니다.

누락된 인덱스 기능 구성 요소 출력에서 작성한 CREATE INDEX 문의 열을 정렬하려면 다음 지침을 사용하십시오.

  • 같음 열(열 목록에서 가장 왼쪽에 있는 열)을 먼저 나열합니다.

  • 같음 열 뒤(나열된 같음 열의 오른쪽)에 같지 않음 열을 나열합니다.

  • CREATE INDEX 문의 INCLUDE 절에 포괄 열을 나열합니다.

  • 같음 열에 효율적인 순서를 결정하려면 선택도를 기준으로 열을 정렬합니다. 즉, 가장 많이 선택되는 열을 먼저 나열합니다.

XML 실행 계획 MissingIndexes 요소의 출력 사용

누락된 인덱스 기능은 쿼리 최적화 프로그램이 쿼리를 최적화할 때 자동으로 생성하는 정보를 사용합니다. 그러나 먼저 SQL Server 인스턴스에서 쿼리를 실행하여 최적화 프로그램에서 이 누락된 인덱스 정보를 생성할 수 있도록 해야 합니다.

다음 예에서는 MissingIndexes 요소에서 반환된 정보로부터 DDL(데이터 정의 언어) 문을 만드는 방법을 보여 줍니다.

  1. SET STATISTICS XML ON 옵션을 사용하여 XML 실행 계획 기능을 설정하고 AdventureWorks2008R2 예제 데이터베이스에 대해 다음 쿼리를 실행합니다.

    USE AdventureWorks2008R2;
    GO
    SET STATISTICS XML ON;
    GO
    SELECT CustomerID, SalesOrderNumber, SubTotal
    FROM Sales.SalesOrderHeader
    WHERE ShipMethodID > 2
    AND SubTotal > 500.00
    AND Freight < 15.00
    AND TerritoryID = 5;
    GO
    
  2. 생성된 실행 계획의 MissingIndexes 요소에서 반환된 출력을 확인합니다.

    <MissingIndexes>

      <MissingIndexGroup Impact="95.8296">

        <MissingIndex Database="[AdventureWorks2008R2]" Schema="[Sales]" Table="[SalesOrderHeader]">

          <ColumnGroup Usage="EQUALITY">

            <Column Name="[TerritoryID]" ColumnId="14" />

          </ColumnGroup>

          <ColumnGroup Usage="INEQUALITY">

            <Column Name="[ShipMethodID]" ColumnId="17" />

            <Column Name="[SubTotal]" ColumnId="21" />

            <Column Name="[Freight]" ColumnId="23" />

          </ColumnGroup>

          <ColumnGroup Usage="INCLUDE">

            <Column Name="[SalesOrderNumber]" ColumnId="8" />

            <Column Name="[CustomerID]" ColumnId="11" />

          </ColumnGroup>

        </MissingIndex>

      </MissingIndexGroup>

    </MissingIndexes>

  3. MissingIndex ColumnGroup 요소에 반환된 정보를 사용하여 다음과 같이 CREATE INDEX DDL 문을 작성함으로써 누락된 인덱스를 만듭니다.

    USE AdventureWorks2008R2;
    GO
    IF EXISTS (SELECT name FROM sys.indexes
               WHERE name = N'IX_SalesOrderHeader_TerritoryID')
         DROP INDEX IX_SalesOrderHeader_TerritoryID ON Sales.SalesOrderHeader;
    GO
    CREATE NONCLUSTERED INDEX IX_SalesOrderHeader_TerritoryID
         ON Sales.SalesOrderHeader (TerritoryID, ShipMethodID, SubTotal, Freight)
         INCLUDE (SalesOrderNumber, CustomerID);
    GO
    

    이 CREATE INDEX 문은 MissingIndex 요소에 나열된 데이터베이스(USE AdventureWorks2008R2), 스키마 및 테이블 이름(ON Sales.SalesOrderHeader)을 사용합니다. 또한 키 열(TerritoryID, ShipMethodID, SubTotal, Freight)과 키가 아닌 열(INCLUDE (SalesOrderNumber, CustomerID))의 각 ColumnGroup 하위 요소에 대해 나열된 열을 사용합니다.

동적 관리 개체에서 반환된 결과 사용

누락된 인덱스 정보를 검색하려면 SQL Server 인스턴스에서 쿼리를 실행하여 쿼리 최적화 프로그램에서 이 누락된 인덱스 정보를 생성할 수 있도록 해야 합니다.

다음 예에서는 sys.dm_db_missing_index_details 동적 관리 뷰에서 반환된 정보로부터 DDL 문을 만드는 방법을 보여 줍니다.

  1. AdventureWorks2008R2 예제 데이터베이스에 대해 다음 쿼리를 실행합니다.

    USE AdventureWorks2008R2;
    GO
    SELECT City, StateProvinceID, PostalCode
    FROM Person.Address
    WHERE StateProvinceID = 9;
    GO
    
  2. sys.dm_db_missing_index_details 동적 관리 뷰에 대해 다음 쿼리를 실행합니다.

    SELECT *
    FROM sys.dm_db_missing_index_details
    

    이 동적 관리 뷰를 쿼리하면 다음 결과가 반환됩니다.

index_handle

database_id

object_id

equality_columns

inequality_columns

included_columns

statement

1

6

53575229

[StateProvince]

NULL

[City], [PostalCode]

[AdventureWorks].[Person].[Address]

  1. sys.dm_db_missing_index_details 동적 관리 뷰를 쿼리한 후 다음과 같이 equality_columns, included_columns 및 statement 열에 반환된 정보를 사용하여 누락된 인덱스를 만들 수 있습니다.

    USE AdventureWorks2008R2;
    GO
    IF EXISTS (SELECT name FROM sys.indexes
               WHERE name = N'IX_PersonAddress_StateProvinceID')
         DROP INDEX IX_PersonAddress_StateProvinceID ON Person.Address;
    GO
    CREATE NONCLUSTERED INDEX IX_PersonAddress_StateProvinceID
         ON Person.Address (StateProvinceID)
         INCLUDE (City, PostalCode);
    GO
    

이 예에서 inequality_columns는 sys.dm_db_missing_index_details 결과 집합에 반환되지 않았습니다. 이러한 열이 반환되었다면 equality_columns 뒤에 나열했을 것입니다. included_columns에 반환된 열은 항상 CREATE INDEX 문의 INCLUDE 절에 나열됩니다.