탐색 술어와 술어의 차이점


12

SQL Server 2014 Enterprise의 쿼리 성능을 조정하려고합니다.

나는 SQL 센트리 계획 탐색기에서 실제 쿼리 계획을 개설하고 나는 그것이 것을 하나 개의 노드에서 볼 수있는 술어를 탐색 도 및 술어

Seek PredicatePredicate 의 차이점은 무엇입니까 ?

여기에 이미지 설명을 입력하십시오

참고 :이 노드에 많은 문제가 있음을 알 수 있습니다 (예 : Estimated vs Actual rows, 잔여 IO). 질문은 그 노드와 관련이 없습니다.


3
seek 술어는 조인을 지원하여 다른 테이블에도있는 행 (수정 한 행) 만 필터링합니다. 술어 (잔여 술어) 는 특정 상태가 2 인 행 제거합니다.
Aaron Bertrand

5
Rob Farley는 다음과 같은 의견을 제시 했습니다 .The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
Aaron Bertrand

답변:


18

몇 개의 열과 함께 백만 개의 행을 임시 테이블에 넣습니다.

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;

BETWEENAaron 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 행으로 줄일 수 있습니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.