If exists
(
select 1 from table A join table B
on A.id = B.id
)
BEgin
Select 'Pass'
END
Select 'Fail'
我对上面的查询感到困惑,因为它被包含在如果存在语句中的时间超时时才会执行。
当声明
select 1 from table A join table B
on A.id = B.id
被执行,得到结果需要20秒但是当它包裹在如果存在语句中时,它根本没有执行,最后在4到5小时后我不得不取消它。 这可能是什么原因?
答案 0 :(得分:0)
尝试使用top 1 like,
select top 1 1 from table A join table B on A.id = B.id
这可能会减少你的时间。
答案 1 :(得分:0)
你研究过执行计划了吗? 我怀疑性能问题比存在的最终使用更深入,如果完整的查询可用,它将有所帮助 - 或者至少是其结构的完整表示。在评论中,您指出了这个更精细的结构:
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(这里是子查询) 如果该子查询产生大量行,则性能会降低。加入或使用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
这件作品的执行计划告诉你什么?
这样的工作应该有助于整体优化。