Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 当用作EXISTS子查询时,查询速度较慢_Tsql_Exists - Fatal编程技术网

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