当作为EXISTS子查询使用时,查询变得缓慢

5

我有以下查询:

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
请参考https://dev59.com/LnRC5IYBdhLWcg3wD8xV,了解关于EXISTS的良好信息。 - StAlphonzo
1个回答

5
我亲眼见过这种情况。 我猜在WHERE子句中使用EXISTS更好,因为它提供了半连接,这是基于集合的,并且正是你所需要的。 在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

在某些情况下进行了优化:
如何最好地检查项目是否存在:选择 Count(ID) OR Exist(...)?

不确定什么使优化器困惑...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接