我有以下查询:
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应该被优化为在找到第一条记录后停止。为什么这需要更长时间?
答案 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(...)?
不确定优化器有什么混淆......