(使用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中会导致如此多的额外计算吗?或者有任何想法可以解决这个问题(我只是想通过原始查询抛出一个错误,如果发现任何记录)。
谢谢!
EXISTS
中吗?选择top 1不会有任何作用,因为exists扫描表格,如果找到记录,则返回true,并且不关心其他计算。但我首先会从执行计划开始思考。 - Evaldas Buinauskas