首先,我没有权限查看执行计划,这就是为什么我不共享它,如果我可以获得这些权限,我会在以后添加它。
我在SQL Server 2012中运行一个查询,就像这样,这只是为了说明问题,真正的字段名称让这个更难理解。
SELECT columns
FROM
(SELECT column1, column2
FROM table1
WHERE column3 = condition) AS a
LEFT JOIN b ON a.a = b.b
LEFT JOIN c ON a.c = c.c
LEFT JOIN d ON a.d = d.d
LEFT JOIN e ON a.e=e.e
WHERE
e.column IS NULL
没有e.column IS NULL
,它返回大约200行,过滤后返回大约100行。
现在问题是,如果我删除WHERE e.column IS NULL
,它会在8秒内执行,如果我添加WHERE
,则需要超过35秒。
如果我使用临时表存储结果,然后过滤临时表,则需要< 1秒(显然)。
任何想法为什么IS NULL比较如此长的行如此之久? 我希望我能说清楚。
谢谢!
答案 0 :(得分:1)
在不查看实际执行计划的情况下,我们所能做的就是推测。
如果您添加或不添加条件,我的 guess 是连接序列更改。如果E有很多行,这会产生巨大的影响。
没有条件,连接序列可能:
如果E有数百万行,那么它不会使SQL变慢,因为它已经被A预先过滤,并且通过索引访问E.
条件,连接序列可能:
在这种情况下,如果E有数百万或行,则条件需要评估E上的所有行,然后转到A,其余部分。这要慢得多。
但是,这只是猜测。