SQL Server:IF EXISTS大大减慢了查询速度

Joh*_*ill 6 sql sql-server exists query-optimization sql-server-2012

(正在使用SQL Server 2012)

我找到了一些关于查询优化的主题,并将EXISTS与COUNT进行比较,但我找不到这个确切的问题.

我有一个看起来像这样的查询:

select * from
tblAccount as acc
join tblUser as user on acc.AccountId = user.AccountId
join tblAddress as addr on acc.AccountId = addr.AccountId
... **a few more joins**
where acc.AccountId in (
    select * accountid from
    (select accountid, count(*) from tblUser
    where flag = 1
    group by accountId) as tbl where c != 1
Run Code Online (Sandbox Code Playgroud)

此查询立即运行(尽管db非常大,大约70Gb).

当我将查询包装在EXISTS中时,如下所示:

if exists
(
  **Exact same query as above**
)
begin
RAISERROR('Account found without exactly one flagged user.', 16, 1);
end
else
begin
  print 'test passed.'
end
Run Code Online (Sandbox Code Playgroud)

突然,查询大约需要5-6秒才能完成.我已经尝试过指定IF EXISTS(SELECT TOP 1 FROM ...并且还尝试了NOT EXISTS(甚至更慢).但是它们都没有加快速度.

如果正常的选择查询基本上立即完成,那么有人知道为什么将它包装在EXISTS中会导致如此多的额外计算吗?和/或任何人有任何想法解决这个问题(如果原始查询找到任何记录,我只是想抛出一个错误).

谢谢!

小智 8

您是否尝试使用TOP 1运行原始查询?最有可能的是它会一样慢.

有时,当优化认为事情很可能与将返回一个庞大的集毫不费力的数据(即几乎所有的记录会得到返回),它选择主要是循环连接,因为它只需要得到的第一个和循环连接仅适用于获取几个记录.当结果证明不成立时,需要花费一天的时间才能获得结果.

在你的情况下,它听起来很罕见,所以这个选择伤害很严重.尝试做类似的事情SELECT @count = COUNT(*) FROM ...,然后检查该计数是否为非零.