따라서 시나리오입니다.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는 도움이되지 않으므로 캐쉬 된 쿼리 계획에는 문제가 없습니다.
질문에 차이가 있습니까?
감사합니다.
편집 : 우연히 같은 것을 두 번째 쿼리에 넣고 올바르게 반영하도록 업데이트했습니다.
@ P1 매개 변수가 명령 문자열에 하드 코드 된 경우 어떻게 될지 궁금합니다. 그러면 실행 시간은 얼마나됩니까? – PacoDePaco
매개 변수를 하드 코드하면 계획이 동일 해집니다. – mrQQ