我有以下查询:
SELECT I.InsuranceID
FROM Insurance I
INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID
WHERE I.InsuranceLookupID IS NULL
AND JD.JobID = 28
Run Code Online (Sandbox Code Playgroud)
它大约在一秒钟内执行。当用作子查询时如下:
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
Run Code Online (Sandbox Code Playgroud)
需要 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)
Run Code Online (Sandbox Code Playgroud)
不过你可以这样做
SELECT SIGN(COUNT(*))
FROM Insurance I
INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID
WHERE I.InsuranceLookupID IS NULL
AND JD.JobID = 28
Run Code Online (Sandbox Code Playgroud)
它在某些情况下进行了优化:
检查项目是否存在的最佳方法是什么:选择计数(ID)或存在(...)?
不确定是什么让优化器感到困惑......