TSQL 변수로 Top이 더 빠른 이유는 무엇입니까?


10

모두 아침

나는 타사 제품 데이터베이스에서 일부 데이터를 '인쇄'하여 자체 사내 응용 프로그램에 표시하기 위해 약간 복잡한 SQL을 작성했습니다.

하위 쿼리 내의 테이블에서 최상위 레코드를 가져 오기 위해 select에 추가했습니다 (그렇다면 말이됩니다)

쿼리를 사용하여 100 분의 최종 결과 집합을 반환하는 데 거의 3 분이 걸렸습니다.

SELECT TOP 1 ...

나는 달성하려는 것에 대한 개선 사항을 온라인으로 보았고 아래처럼 변수를 사용하도록 선택을 변경하는 것이 좋습니다.

DECLARE @topCount INT
SET @topCount = 1

SELECT TOP (@topCount) ...

이것은 3 분에서 1 초까지 동일한 쿼리를 수행했습니다.

그러나 이것이 왜 그런지 설명 할 수 있습니까?

답변:


14

당신이 할 때 top 1쿼리 최적화가 가능한 한 빨리 1 개 행을 가져 오기 위해 구축 계획을 구축 할 것입니다.

로컬 변수를 사용하면 변수 값을 옵티마이 저가 알 수 없으며 대신 100 행을 가능한 빨리 가져 오도록 최적화 된 계획을 작성합니다.

귀하의 경우 행 목표 100으로 생성 된 쿼리 계획은 하나의 행만 원할 때도 사용하는 것이 좋습니다.

확인하려면 option (recompile)변수를 사용하여 쿼리 에 추가 할 수 있습니다. 이 경우 SQL Server는 현재 @topCount목표 값을 행 목표로 사용하므로 1이므로 느린 계획을 세워야합니다.


계획의 차이점을 이해하지만 1 행을 가져 오는 것이 100 행을 가져 오는 것보다 느릴 수 있다는 사실에 놀랍습니다. 100 행 계획이 가장 효과적이라면 SQL Server는에 대해 동일한 계획을 사용한다고 생각합니다 top 1.
Brandon

@Brandon은 100 행을 가져 오지 않고 100 행이 원하는 것으로 가정하여 실행 계획을 작성합니다. 1 개의 행이 발견되면 실행이 종료됩니다.
Mikael Eriksson

이 경우 실행 계획과 다른 점을 확인하면 문제가 상위 1의 문제를 이해하는 데 도움이 될 것입니다.
James Z
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.