使用“SQL Server查询速度慢”;“左连接”;及;其中字段为空";

使用“SQL Server查询速度慢”;“左连接”;及;其中字段为空";,sql,sql-server-2012,Sql,Sql Server 2012,首先,我没有查看执行计划的权限,这就是我不共享它的原因,如果我可以获得这些权限,我将在以后添加它 我在SQLServer2012中运行一个查询,类似于这样,这只是为了说明问题,真实的字段名称使理解变得更加复杂 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

首先,我没有查看执行计划的权限,这就是我不共享它的原因,如果我可以获得这些权限,我将在以后添加它

我在SQLServer2012中运行一个查询,类似于这样,这只是为了说明问题,真实的字段名称使理解变得更加复杂

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为空
,则返回大约200行,过滤后返回大约100行

现在的问题是,如果我删除
其中e.column为NULL
,它将在8秒内执行,如果我添加
其中
,它将花费35秒以上的时间

如果我使用一个临时表来存储结果,然后过滤临时表,这需要<1秒(显然)

你知道为什么IS NULL比较花了这么长时间,而行却这么少吗? 我希望我能说清楚


谢谢大家!

不看实际执行计划,我们所能做的就是猜测

我的猜测是,如果添加或不添加条件,连接序列会发生变化。如果E有许多行,这会产生巨大的影响

  • 如果没有连接序列的条件可以是:

    • A
    • 然后B
    • 然后C
    • 然后D
    • 然后E
    如果E有数百万行,它不会使SQL变慢,因为它已经被A预先过滤,并通过索引访问E

  • 使用连接序列的条件可以是:

    • E
    • 然后
    • 然后B
    • 然后C
    • 然后D
    在这种情况下,如果E有数百万行或更多行,则条件将需要计算E上的所有行,然后转到A,然后计算其余行。这要慢得多


  • 但是,这只是一个猜测。

    是所有表格的最新统计数据。任何附加条件都会增加成本。尝试使用not exists而不是检查e.field是否为空。您是否可以发布执行计划,其中e.e是否为空?@gordy抱歉,正如我所说,我没有查看执行计划的权限。在执行计划之前,我先在第一个select LEN(列)中使用它作为测试,然后添加一个带有“where test IS NULL”的外部select来“解决”它(减少70%的时间),如果我在执行计划时使用列,那么速度会慢一些。我尝试过使用ISNULL(),但速度较慢…现在我需要看看执行计划,需要知道这背后发生了什么,以正确的方式解决它。谢谢你,我';我在连接后使用where-to-filter,因此我在一个表中拥有所有非&39;我不在别的地方。不';它不应该在所有连接之后运行吗?只过滤200行?非常感谢。