目前,我發現在我們的應用程序一個查詢及其執行計劃「索引掃描」。好了,這裏有一些背景:SQL Server 2005中執行計劃的問題
- 它有三個列,類型爲「idType :bigint「
- 手頭上只有200件爆炸物品
- 有列(a:PK,b:FK,c:FK),我們有兩個索引(一個聚簇索引(b,c),一個PK非聚集索引(a))
以下是我們的查詢:
exec sp_executesql N'select b,a from table where b in (@P0, @P1, @P2,
@P3, @P4, @P5, @P6, @P7, @P8, @P9)',
N'@P0 bigint, @P1 bigint, @P2 bigint, @P3 bigint, @P4 bigint, @P5 bigint,
@P6 bigint, @P7 bigint, @P8 bigint, @P9 bigint',
94, 161, 4, 50, 166, 52, 53, 90, 100, 123
它從執行計劃顯示爲pk索引上的「索引掃描」...出了什麼問題?
如果我使用相同的查詢,但不能使用「sp_executesql的」,如:
select b,a from table where b in(94,161,4,50,166,52,53,90,100,123)
它顯示「聚集索引查找」如我所料
爲什麼會使用SQL Server「索引掃描」的第一個查詢?它是否與函數 「sp_executesql」本身有關?
謝謝你在進階 萬斯
實際「CREATE TABLE」和「CREATE INDEX」語句比描述更容易理解(一般說明:只要刪除多餘的列,如果表格很寬,並且問題可以用列的子集來演示) – 2011-03-01 09:16:27
嘗試在存儲過程中執行代碼,查看執行計劃是否與sp_execute或T-SQL計劃相同將會很有趣。 (這不一定是解決您的問題,我只是想獲得更多信息) – Tony 2011-03-01 09:53:37
謝謝大家的回覆! @Tony我把第一個查詢'exec sp_executesql N'...)在一個SP中,並得到「index_scan」相同。這個問題涉及到我的測試表的值是小的嗎?我只有200個項目,所以sql服務器不會「優化」它的查詢執行嗎? – Vance 2011-03-01 10:03:08