用作EXISTS子查询时查询速度慢

时间:2011-10-04 17:22:15

标签: tsql 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

它在大约一秒钟内执行。当用作子查询时如下:

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 个答案:

答案 0 :(得分: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(...)?

不确定优化器有什么混淆......