我有需要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