我有以下查询:
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
上面的查询将在三秒钟内完成。
如果上面的查询返回任何值,我们希望存储过程为EXIT,因此我将其重写如下:
If Exists(
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
)
Begin
Raiserror('Source missing',16,1)
Return
End
但是,这需要10分钟。
我可以像下面这样重写上面的查询,它也可以在不到3秒的时间内完成:
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source
if @@rowcount >0
Begin
Raiserror('Source missing',16,1)
Return
End
上面重写的问题在于,上面的查询是更大的存储过程的一部分,并且它返回多个结果集。在C#中,我们遍历每个结果集并进行一些处理。
上面的返回一个空结果集,因此,如果我采用这种方法,则必须更改C#并再次进行部署。
所以我的问题是
为什么只使用
IF EXISTS
更改计划就需要这么多时间?
以下是可能对您有帮助的详细信息,如果您需要任何详细信息,请告诉我:
- 创建表和统计脚本以获取与我相同的计划
- 慢执行计划
快速执行计划
注意:这两个查询都是相同的(使用参数),唯一的区别是EXISTS
(尽管匿名时我可能会犯一些错误)。
表创建脚本如下:
http://pastebin.com/CgSHeqXc- 小表统计
http://pastebin.com/GUu9KfpS- 大表统计