샌드백
최고 품질의 블로그 Posts®에서 작업하는 동안, 나는 정말 발견 된 일부 최적화 동작 건너 온 화나는 재미를. 나는 즉시 설명이 없습니다. 적어도 하나도 만족스럽지 않으므로 누군가 똑똑하게 나타날 수 있도록 여기에 넣겠습니다.
따라하고 싶다면 2013 버전의 스택 오버플로 데이터 덤프를 여기 에서 가져올 수 있습니다 . Comments 테이블과 하나의 추가 인덱스를 사용하고 있습니다.
CREATE INDEX [ix_ennui] ON [dbo].[Comments] ( [UserId], [Score] DESC );
쿼리 하나
이렇게 테이블을 쿼리하면 이상한 쿼리 계획이 나타납니다 .
WITH x
AS
(
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score DESC
)
SELECT *
FROM x
WHERE x.Score >= 500;
Score의 SARGable 술어는 CTE 내부로 푸시되지 않습니다. 계획에서 훨씬 나중에 필터 연산자에 있습니다.
ORDER BY
필터와 동일한 열에 있기 때문에 이상하다고 생각 합니다.
쿼리 2
쿼리를 변경하면 푸시됩니다.
WITH x
AS
(
SELECT c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
)
SELECT TOP 101 *
FROM x
WHERE x.Score >= 500
ORDER BY x.Score DESC;
쿼리 계획 변경 도, 디스크없이 유출로, 훨씬 빠르게 실행됩니다. 비 클러스터형 인덱스 스캔의 조건 자와 함께 동일한 결과를 생성합니다.
쿼리 3
이것은 다음과 같이 쿼리를 작성하는 것과 같습니다.
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
WHERE c.Score >= 500
ORDER BY c.Score DESC;
쿼리 4
파생 테이블을 사용하면 초기 CTE 쿼리와 동일한 "잘못된"쿼리 계획이 적용됩니다.
SELECT *
FROM ( SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score DESC ) AS x
WHERE x.Score >= 500;
다음과 같은 경우 상황이 더욱 악화됩니다.
데이터를 오름차순으로 정렬하도록 쿼리를 변경하고 필터를로 변경 <=
합니다.
이 질문을 오랫동안하지 않기 위해 모든 것을 하나로 모을 것입니다.
쿼리
--Derived table
SELECT *
FROM ( SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score ASC ) AS x
WHERE x.Score <= 500;
--TOP inside CTE
WITH x
AS
(
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score ASC
)
SELECT *
FROM x
WHERE x.Score <= 500;
--Written normally
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
WHERE c.Score <= 500
ORDER BY c.Score ASC;
--TOP outside CTE
WITH x
AS
(
SELECT c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
)
SELECT TOP 101 *
FROM x
WHERE x.Score <= 500
ORDER BY x.Score ASC;
계획
링크 계획 .
이러한 쿼리 중 비 클러스터형 인덱스를 활용하는 쿼리는 없습니다. 여기서 변경되는 것은 필터 연산자의 위치뿐입니다. 술어가 인덱스 액세스로 푸시되는 경우는 없습니다.
질문이 나타납니다!
SARGable 술어가 다른 시나리오가 아닌 일부 시나리오에서 푸시 될 수있는 이유가 있습니까? 내림차순으로 정렬 된 쿼리 내의 차이점은 흥미롭지 만, 기괴한 오름차순의 차이점은 흥미 롭습니다.
관심있는 사람들을 위해 다음과 같은 인덱스 만있는 계획이 있습니다 Score
.