(正在使用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
该查询会立即运行(尽管数据库很大,大约 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
突然间,查询需要大约 5-6 秒才能完成。我尝试过指定 IF EXISTS (SELECT TOP 1 FROM... 并尝试过 NOT EXISTS (甚至更慢)。但这两种方法都无法加快速度。
如果正常的选择查询基本上立即完成,那么有人知道为什么将其包装在 EXISTS 中会导致如此多的额外计算吗?和/或任何人有任何想法来解决这个问题(如果原始查询找到任何记录,我只是想抛出一个错误)。
Thanks!
您是否尝试使用 TOP 1 运行原始查询?很可能它也会同样慢。
有时,当优化器认为某件事很可能发生并且会毫不费力地返回大量数据(即几乎所有记录都会返回)时,它主要选择循环连接,因为它只需要获取第一个和一个循环连接适合只获取几条记录。当事实证明这不是真的时,需要很长时间才能得到结果。
就你而言,这听起来非常罕见,所以这个选择很痛苦。尝试做类似的事情SELECT @count = COUNT(*) FROM ...
然后检查该计数是否非零。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)