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 ...,然后检查该计数是否为非零.