SQL Server查询使用" left join"和" WHERE字段IS NULL"

时间:2018-04-17 23:41:28

标签: sql sql-server-2012

首先,我没有权限查看执行计划,这就是为什么我不共享它,如果我可以获得这些权限,我会在以后添加它。

我在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比较如此长的行如此之久? 我希望我能说清楚。

谢谢!

1 个答案:

答案 0 :(得分:1)

在不查看实际执行计划的情况下,我们所能做的就是推测。

如果您添加或不添加条件,我的 guess 是连接序列更改。如果E有很多行,这会产生巨大的影响。

  1. 没有条件,连接序列可能

    • A
    • 然后B
    • 然后C
    • 然后D
    • 然后E

    如果E有数百万行,那么它不会使SQL变慢,因为它已经被A预先过滤,并且通过索引访问E.

  2. 条件,连接序列可能

    • 电子
    • 然后A
    • 然后B
    • 然后C
    • 然后D

    在这种情况下,如果E有数百万或行,则条件需要评估E上的所有行,然后转到A,其余部分。这要慢得多。

  3. 但是,这只是猜测。