Tsql 当用作EXISTS子查询时,查询速度较慢
我有以下疑问:Tsql 当用作EXISTS子查询时,查询速度较慢,tsql,exists,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
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进行优化,以便在找到第一条记录后停止。为什么这需要更长的时间?我自己也看到过 我可以猜EXISTS在WHERE子句中更好,因为它提供了一个基于集合的半联接,这正是您所需要的 在IF中,乐观主义者并不清楚这一点。也就是说,没有什么可以半加入的。这应该是一样的(糟糕的是): 不过你可以这么做
SELECT SIGN(COUNT(*))
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