몇 개의 열과 함께 백만 개의 행을 임시 테이블에 넣습니다.
CREATE TABLE #174860 (
PK INT NOT NULL,
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (PK)
);
INSERT INTO #174860 WITH (TABLOCK)
SELECT RN
, RN % 1000
, RN % 10000
FROM
(
SELECT TOP 1000000 ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) RN
FROM master..spt_values v1,
master..spt_values v2
) t;
CREATE INDEX IX_174860_IX ON #174860 (COL1) INCLUDE (COL2);
여기 PK
열에 클러스터 된 인덱스 (기본적으로)가 있습니다. COL1
에 키 열이 COL1
있고를 포함 하는 비 클러스터형 인덱스 가 있습니다 COL2
.
다음 쿼리를 고려하십시오.
SELECT *
FROM #174860
WHERE PK >= 15000 AND PK < 15005
AND COL2 = 5000;
BETWEEN
Aaron Bertrand 가이 질문에 매달려 있기 때문에 여기서는 사용하지 않습니다 .
SQL Server 최적화 프로그램은 어떻게 쿼리해야합니까? 글쎄, 필터를 PK
켜면 결과 집합이 5 행으로 줄어 듭니다. SQL Server는 클러스터 된 인덱스를 사용하여 테이블의 모든 백만 행을 읽지 않고 5 개의 행으로 이동할 수 있습니다. 그러나 클러스터형 인덱스에는 PK 열만 키 열로 있습니다. 행이 메모리로 읽 히면에 필터를 적용해야합니다 COL2
. 여기, PK
탐색 술어이며 COL2
술어입니다.
SQL Server는 seek 술어를 사용하여 5 개의 행을 찾고 일반 술어를 사용하여 5 개의 행을 1 개의 행으로 더 줄입니다.
클러스터형 인덱스를 다르게 정의하면 :
CREATE TABLE #174860 (
PK INT NOT NULL,
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (COL2, PK)
);
그리고 다른 결과를 얻는 동일한 쿼리를 실행하십시오.
이 경우 SQL Server는 WHERE
절의 두 열을 모두 사용하여 검색 할 수 있습니다 . 키 열을 사용하여 테이블에서 정확히 하나의 행을 읽습니다.
하나 이상의 예를 들어 다음 쿼리를 고려하십시오.
SELECT *
FROM #174860
WHERE COL1 = 500
AND COL2 = 3545;
IX_174860_IX 색인은 조회에 필요한 모든 열을 포함하므로 포함 색인입니다. 그러나 COL1
키 열만 있습니다. SQL Server는 해당 열을 사용하여 일치하는 COL1
값을 가진 1000 개의 행을 찾을 수 있습니다. 또한 열에서 해당 행을 필터링 COL2
하여 최종 결과 세트를 0 행으로 줄일 수 있습니다.