exists()条件性能问题

时间:2013-05-09 08:22:34

标签: sql-server-2012 exists query-performance

我有一个简单的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'

但子查询(如果存在(子查询)打印'警告消息')本身会立即执行(请参阅下面的屏幕截图)

"全"查询 enter image description here

子查询 enter image description here

两个查询的生成估计执行计划(见下文)显示子查询的查询成本必须高于" full"查询...其中,如上所述,第一个(子查询)立即运行,第二个("完全")运行无限长......

enter image description here

发生了什么?


ORIGINAL QUERY

enter image description here

2 个答案:

答案 0 :(得分:0)

试试这个:

if exists(

    select 1 from [files].[Contacts_Migration_Template] c left join 
    [files].[Additional_Contact_Migration_Template] a
    on c.[migration id]=a.contact 
    where a.contact is null
       )

print 'warning message'

答案 1 :(得分:0)

我使用临时表来破坏执行顺序。它有所帮助。

select 1 [x] into #tmp_87624435
from [files].[Contacts_Migration_Template] c
where not exists( select 1
    from [files].[Additional_Contact_Migration_Template]
    where contact = c.[migration id]);
if exists(select 1 from #tmp_87624435) throw 51000, 'warning', 1;

但是我仍然认为即使这对于这样一个简单的问题也是过度的:)