我有需要10秒聲明,表X上10K項目執行:爲什麼我的不相關的子查詢很慢?
1版
SELECT *
FROM X
WHERE pk = 77843
AND (a IS NULL OR a NOT IN (SELECT DISTINCT(b)
FROM X
WHERE pk = 77843
AND l IS NOT NULL))
子查詢是不相關的,這意味着它沒有提及外部查詢。這意味着子查詢只應執行一次。
版本2:
現在,如果我提取子查詢和預先查詢在< 1S執行執行計算。
DECLARE @listOfb table (id int)
INSERT INTO @listOfb(id)
(SELECT DISTINCT(b) as Numbers
FROM X
WHERE pk = 77843
AND l IS NOT NULL)
SELECT *
FROM X
WHERE pk = 77843
AND (a IS NULL OR a NOT IN (SELECT * FROM @listOfb))
那麼爲什麼版本2比版本1快得多呢?
更新
我加入了(我認爲所謂的)版本1的執行計劃: 查詢被刪除10k左右行。
你看過**執行計劃**的兩個查詢嗎? –
'DISTINCT'不是一個函數(在列上),它是'SELECT DISTINCT'的一部分,適用於整個選定的行。刪除那些冗餘括號以使事情更清晰! 'SELECT DISTINCT(a),b ...'最好寫爲'SELECT DISTINCT a,b ...',但也可以寫爲'SELECT DISTINCT a,(b)...' – jarlh
,不需要在這裏執行SELECT DISTINCT ... – jarlh