使用“SQL Server查询速度慢”;“左连接”;及;其中字段为空";
首先,我没有查看执行计划的权限,这就是我不共享它的原因,如果我可以获得这些权限,我将在以后添加它 我在SQLServer2012中运行一个查询,类似于这样,这只是为了说明问题,真实的字段名称使理解变得更加复杂使用“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
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
- 然后
- 然后B
- 然后C
- 然后D
但是,这只是一个猜测。是所有表格的最新统计数据。任何附加条件都会增加成本。尝试使用not exists而不是检查e.field是否为空。您是否可以发布执行计划,其中e.e是否为空?@gordy抱歉,正如我所说,我没有查看执行计划的权限。在执行计划之前,我先在第一个select LEN(列)中使用它作为测试,然后添加一个带有“where test IS NULL”的外部select来“解决”它(减少70%的时间),如果我在执行计划时使用列,那么速度会慢一些。我尝试过使用ISNULL(),但速度较慢…现在我需要看看执行计划,需要知道这背后发生了什么,以正确的方式解决它。谢谢你,我';我在连接后使用where-to-filter,因此我在一个表中拥有所有非&39;我不在别的地方。不';它不应该在所有连接之后运行吗?只过滤200行?非常感谢。