我遇到以下情況:爲什麼IN語句中的項目列表比IN語句中的子查詢更快?
我有一個相當複雜的視圖,我必須從中選擇一對記錄。
SELECT * FROM VW_Test INNER JOIN TBL_Test ON VW_Test.id = TBL_Test.id
WHERE VW_Test.id IN (1000,1001,1002,1003,1004,[etc])
這實際上會立即返回結果(當前在該IN語句中有25個項目)。但是,當我使用以下查詢時,速度非常快。
SELECT * FROM VW_Test INNER JOIN TBL_Test ON VW_Test.id = TBL_Test.id
WHERE VW_Test.id IN (SELECT id FROM TBL_Test)
在TBL_Test中有25條記錄,這個查詢大約需要5秒。我在TBL_Test中找到了該ID的索引。
任何人都知道爲什麼發生這種情況以及如何獲得性能?
編輯:我忘了提,這個子查詢
SELECT id FROM TBL_Test
返回結果立即爲好。
「TBL_Test」上的統計信息是否爲最新?請比較執行計劃,看看它們之間有什麼不同。這是你的實際查詢還是你簡化了它?不知道您是否可能在子查詢中使用了不可更改的過濾器,從而導致統計數據估計錯誤。 –
@Kirill該查詢執行完全相同。 – SouthL
@Martin執行計劃之間的區別似乎是,它在第一個過濾視圖很快。當我使用子查詢時,它會拉起整個視圖,然後將它與TBL_Test連接起來 – SouthL