3
If exists 
(
 select 1 from table A join table B
 on A.id = B.id
)
BEgin  
  Select 'Pass'
END
  Select 'Fail'

我对上面的查询感到困惑,它根本没有执行,直到它被包裹在If exists中时它超时语句中时才超时。

当声明

 select 1 from table A join table B
 on A.id = B.id

执行时,需要 20 秒才能给出结果,但是当将其包装在If exists语句中时,它根本没有执行,最后在 4 -5 小时后我不得不取消它。这可能是什么原因?

4

2 回答 2

0

尝试使用 top 1 like,

select top 1 1 from table A join table B  on A.id = B.id

这可能会减少您的时间。

于 2013-09-04T04:55:55.780 回答
0

你研究过执行计划吗?我怀疑性能问题比 exists 的最终使用更深层次,如果完整的查询可用 - 或者至少是其结构的完整表示,这将有所帮助。在评论中,您指出了这种更复杂的结构:

SELECT
        1
FROM table_A AS a
LEFT JOIN (                    -- << why a left join, is it achieving anything?
                SELECT
                        *            -- << not literally select * I hope
                FROM table_B AS b
                JOIN table_C AS c
                             ON b.thing = c.thing
                WHERE B.ColumnA IN (                -- << avoid this type of IN()
                                        SELECT      -- >> if this result is big
                                        columnX
                                        FROM table_D AS d
                                        )
                           ) AS x
                             ON a.thing = x.thing
;

在外部查询中,您(或至少表明)仅执行“选择 1”,因此无需在嵌套子查询中选择无关字段。

您指出使用了左连接,但对细节知之甚少,我无法判断它是否需要。

如果子查询产生大量行,性能会下降,那么寻找改进的最明显地方可能是使用 IN(subquery here)。加入或使用 EXISTS 可能是更好的选择。

编辑:关于获取执行计划,考虑从最内层嵌套开始独立运行每个子查询:

                                    SELECT      -- >> if this result is big
                                    columnX
                                    FROM table_D AS d

是否使用索引,返回多少行(也许只是为此做一个计数(*))

从那里开始到下一个子查询,并考虑替代方案。例如,这可能有效:

            SELECT
                    thing  -- << only that which is needed
            FROM table_B AS b
            JOIN table_C AS c
                         ON b.thing = c.thing
            JOIN (
                    SELECT distinct -- >> not a fan of distinct but might help here
                    columnX
                    FROM table_D
                 ) AS D
                   ON B.ColumnA = D.columnX

这篇文章的执行计划告诉你什么?

像这样工作应该有助于整体优化。

于 2013-10-10T04:47:33.240 回答