'composite index'에 해당되는 글 1건

  1. 2014.03.28 Composite Index(복합 열) 고려 사항
MS SQL2014.03.28 11:40

 

[내용]

   

복합열 인덱스를 만들 때, 순서와 상관없이 하면 예상 하지 못한 실행 계획이 만들어 질 수 있습니다. 그만큼 복합열 인덱스에서 순서는 중요합니다. 여러 가지 실험을 통해서 어떤 순서로 하는 것이 좋은지 확인해 봅시다.

   

[테이블 환경]

   

인덱스 순서: OderID, ProductID

   

   

[Test 1]

인덱스 순서에 따른, SEEK 조건자의 변화

USE EPlanHeap

GO

   

SET STATISTICS IO ON

   

   

-- 쿼리의 각 조건들의 선택도를 확인합니다.

-- 3건

SELECT COUNT(*)

FROM [Order Details]

WHERE OrderID = 10248

GO

   

-- 1967건

SELECT COUNT(*)

FROM [Order Details]

WHERE ProductID < 72

GO

   

   

-- 실행계획에서 Seek 조건자를 확인합니다.

SELECT *

FROM [Order Details]

WHERE OrderID = 10248 AND ProductID < 72

GO

   

-- 인덱스 순서를 변경합니다.

ALTER TABLE [Order Details]

DROP CONSTRAINT PK_Order_Details

GO

   

ALTER TABLE [Order Details]

ADD CONSTRAINT PK_Order_Details

PRIMARY KEY NONCLUSTERED

(ProductID DESC, OrderID DESC)

GO

   

-- 변경후, 실행계획에서 Seek 조건자를 확인합니다.

SELECT *

FROM [Order Details]

WHERE OrderID = 10248 AND ProductID < 72

GO

   

   

-- 인덱스 순서를 원래대로 변경합니다.

ALTER TABLE [Order Details]

DROP CONSTRAINT PK_Order_Details

GO

   

ALTER TABLE [Order Details]

ADD CONSTRAINT PK_Order_Details

PRIMARY KEY NONCLUSTERED

(OrderID DESC, ProductID)

GO

  

   

   

[Test 2]

   

인덱스 첫 번째 열이 Equal(=) 조건 일 때와 아닐 때 변화

/*

Test1에 이어서 진행합니다.

*/

   

-- 인덱스 순서를 변경 합니다.

ALTER TABLE [Order Details]

DROP CONSTRAINT PK_Order_Details

GO

   

ALTER TABLE [Order Details]

ADD CONSTRAINT PK_Order_Details

PRIMARY KEY NONCLUSTERED

(ProductID DESC, OrderID DESC)

GO

   

-- 첫 칼럼의 조건식이 범위 연산일 때, SEEK 조건자를 확인합니다.

SELECT * FROM [Order Details]

WHERE ProductID BETWEEN 1 AND 3

AND OrderID = 11047

GO

   

   

   

-- 첫 칼럼이 없다면?

SELECT * FROM [Order Details]

WHERE OrderID = 11047

   

-- ProductID를 Equal 조건이라면?

SELECT * FROM [Order Details]

WHERE OrderID = 11047

AND ProductID IN (1, 2, 3)

   

-- 인덱스 순서 변경

ALTER TABLE [Order Details]

DROP CONSTRAINT PK_Order_Details

GO

   

   

-- 원본

ALTER TABLE [Order Details]

ADD CONSTRAINT PK_Order_Details

PRIMARY KEY NONCLUSTERED

(OrderID DESC, ProductID)

GO

   

  

   

   

[Test 내용 정리]

   

첫 번째 테스트에서는 선택도가 좋은 열(검색 행수가 적은)을 앞에 위치 시켰을 경우에 SEEK 조건자에 모든 조건이 들어 간 것을 확인 할 수 있었습니다.

두 번째 테스트에서는 Equal 조건을 가진 열을 인덱스의 첫 번째열로 구성 하였을 경우 정상적으로 SEEK을 한 것을 확인 할 수 있었습니다.

※ Seek 조건자가 아닌 조건자는 SQL Server 2008 버전 이전에서 볼 수 있었던 Filter 연산으로 생각하시면 됩니다.

   

   

[결론]

   

Index열을 생성할 때 고려 사항

1. 선택도가 높은 순으로 열 순서를 지정

2. Equal(=) 조건을 가지는 조건을 앞으로 지정

 

   

신고

'MS SQL' 카테고리의 다른 글

TempDB 최적화 구성 튜닝  (0) 2014.04.02
Database 소유자 변경 방법  (0) 2014.04.01
Composite Index(복합 열) 고려 사항  (0) 2014.03.28
VLF 크기에 따른 성능 차이  (0) 2014.03.27
Disk Partition Alignment 조정  (0) 2014.03.25
SQL Server 에러로그 파일 수 변경  (0) 2014.03.24
Posted by TM ~ing