2011-10-04 275 views
4

我有以下查询:慢查询EXISTS子查询

SELECT I.InsuranceID 
FROM Insurance I 
INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID 
WHERE I.InsuranceLookupID IS NULL 
AND JD.JobID = 28 

它执行约1秒钟。当用作子查询时如下:

IF EXISTS(
SELECT I.InsuranceID 
FROM Insurance I 
INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID 
WHERE I.InsuranceLookupID IS NULL 
AND JD.JobID = 28 
) 
SELECT 1 
ELSE 
SELECT 0 

需要90秒。这是我的理解,EXISTS应该被优化,以找到第一个记录后停止。为什么这会花更长的时间?

+1

请参阅http://stackoverflow.com/questions/424212/performance-of-sql-exists-usage-variants以获取有关良好信息存在。 – StAlphonzo

回答

4

我已经看到了这个我自己。

我可以猜测EXISTS在WHERE子句中更好,因为它给出了一个基于集合的半连接,并且正是您所需要的。

在IF中,这对优化器不是很清楚。也就是说,也没有什么可以半连接的。这样应该可以是相同的(糟糕的是):

SELECT 1 WHERE EXISTS (SELECT I.InsuranceID 
    FROM Insurance I 
    INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID 
    WHERE I.InsuranceLookupID IS NULL 
    AND JD.JobID = 28) 

,你可以到这虽然

SELECT SIGN(COUNT(*)) 
FROM Insurance I 
INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID 
WHERE I.InsuranceLookupID IS NULL 
AND JD.JobID = 28 

它在某些情况下优化:
What's the best to check if item exist or not: Select Count(ID)OR Exist(...)?

不知道什么迷优化器...

+0

您的SIGN提示非常好,谢谢! –