所以這是場景:sp_execute選擇不同的查詢計劃
表中有許多字段。 Field2是聚簇索引中唯一的字段。 存在不包含任何其他字段的Field1,Field2唯一索引。
表中有500000行,其中499900個字段爲空值。
查詢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