【发布时间】:2013-05-09 08:22:34
【问题描述】:
我有一个无限期运行的简单 SQL 查询(见下文)(我无法等待它完成)
if exists(
select 1
from [files].[Contacts_Migration_Template] c
where not exists(select 1
from [files].[Additional_Contact_Migration_Template]
where contact = c.[migration id])
) print 'warning message'
但是子查询(if exists(subquery) print 'warning message')本身会立即执行(见下面的截图)
“完整”查询
子查询
为两个查询生成的估计执行计划(见下文)表明子查询必须比“完整”查询具有更高的查询成本......其中,正如我上面所说,第一个(子查询)立即运行,第二个(“ full") 运行无限长...
发生了什么事?
原始查询
【问题讨论】:
-
快速的使用散列连接并且只扫描
Additional_Contact_Migration_Template一次。慢速扫描它(或至少一个假脱机副本)多次。统计数据是最新的吗? -
但是如果速度更快,为什么第一个的相对查询成本是 83%(相对于 17%)?
-
这是基于错误的估计。它可能假设嵌套循环内侧的执行次数将比现实中实际发生的次数少得多。实际上可能是row goals gone rogue 的情况。
-
它仍然太简单的查询要走这么久 :) 进一步模式子查询工作得很快,外部存在()只需要打印/抛出
-
如果您添加缺少的索引,那么它应该可以解决问题。或者您可以使用查询提示来强制使用哈希连接而不是嵌套循环。
标签: sql-server-2012 exists query-performance