【问题标题】:Slow query when used as EXISTS subquery用作 EXISTS 子查询时的慢查询
【发布时间】:2011-11-30 21:20:52
【问题描述】:

我有以下疑问:

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 以在找到第一条记录后停止。为什么这需要更长的时间?

【问题讨论】:

标签: tsql exists


【解决方案1】:

我自己也见过这个。

我可以猜测 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(...)?

不确定是什么让优化器感到困惑...

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2020-12-27
    • 2012-12-15
    相关资源
    最近更新 更多