慢查询EXISTS子查询
问题描述:
我有以下查询:慢查询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应该被优化,以找到第一个记录后停止。为什么这会花更长的时间?
答
我已经看到了这个我自己。
我可以猜测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提示非常好,谢谢! –
请参阅http://*.com/questions/424212/performance-of-sql-exists-usage-variants以获取有关良好信息存在。 – StAlphonzo