2016-08-23 4 views
0

따라서 시나리오입니다.sp_execute는 다른 쿼리 계획을 선택합니다.

테이블에는 많은 필드가 있습니다. Field2는 클러스터 된 인덱스의 유일한 필드입니다. 다른 필드를 포함하지 않는 Field1, Field2 고유 인덱스가 있습니다.

테이블에는 500000 개의 행이 있고 그 중 499900 개가 Field1에 대해 비어 있습니다.

쿼리 1 :

SELECT TOP (1) * 
FROM Table WITH(UPDLOCK) 
WHERE (Field1='XXX') ORDER BY Field1 DESC, Field2 DESC OPTION(OPTIMIZE FOR UNKNOWN) 

는 인덱스가 고유 인덱스 필드 1, 필드 2, 클러스터 된 인덱스에 대한 다음 키 조회에 탐색 생산하고 매우 빠릅니다. 그러나

,

Declare @P1 int; 
Exec sp_prepare @P1 output, 
N'@0 nvarchar(20)', 
N'SELECT TOP (1) * 
FROM Table WITH(UPDLOCK) 
WHERE ([email protected]) ORDER BY Field1 DESC, Field2 DESC OPTION(OPTIMIZE FOR UNKNOWN)'; 
Exec sp_execute @P1, N'XXX' 
EXEC sp_unprepare @P1; 

속도가 느립니다 클러스터 인덱스 스캔을 생성합니다.

DBCC FREEPROCCACHE는 도움이되지 않으므로 캐쉬 된 쿼리 계획에는 문제가 없습니다.

질문에 차이가 있습니까?

감사합니다.

편집 : 우연히 같은 것을 두 번째 쿼리에 넣고 올바르게 반영하도록 업데이트했습니다.

+0

@ P1 매개 변수가 명령 문자열에 하드 코드 된 경우 어떻게 될지 궁금합니다. 그러면 실행 시간은 얼마나됩니까? – PacoDePaco

+0

매개 변수를 하드 코드하면 계획이 동일 해집니다. – mrQQ

답변

0

가변적 인 매개 변수로 인해 동일한 계획으로 돌아가도록 하드 코드를 작성하거나 정상 실행시 매개 변수를 입력하면 검사 계획이 생성됩니다.

+0

분명히 그것이 유일한 차이점이지만 그 이유는 무엇입니까? 이 문서는 어디에 기록되어 있습니까? – mrQQ

+0

[this] (https://msdn.microsoft.com/en-us/library/ee343986(SQL.100).aspx) 문서에서 정보를 얻을 수 있습니다. 필자의 의견으로는 Itzik Ben-Gan의 'Querying Microsoft SQL Server 2012'17 장, 2 단원 '매개 변수화 된 쿼리 및 일괄 처리 사용'의 책에서 잘 설명되어 있습니다. – PacoDePaco

+0

기사의 어느 부분이 이것과 관련이 있다고 생각하십니까? – mrQQ