gpt4 book ai didi

sql - 为什么将 SQL 查询包装在 if 语句中会显着增加其运行时间?

转载 作者:行者123 更新时间:2023-12-03 22:45:13 28 4
gpt4 key购买 nike

以两种不同的方式运行相同的查询时,我遇到了奇怪的性能差异。从字面上看,唯一的区别是它是否包含在 if 语句中。

此查询实际上是更大查询的一部分,但我已将其作为罪魁祸首。

自行运行查询几乎立即返回(返回 0)

select COUNT(*) from Responses r where r.ResponseID not in (
select ResponseID from data.GamingReport_Computerized
))

最终,我想避免根据该查询的结果运行复杂的计算,所以我将它包装在这样的 if 语句中,但运行时间要长得多(约 10 秒),我不知道为什么:
if (0 = (select COUNT(*) from Responses r where r.ResponseID not in (
select ResponseID from data.GamingReport_Computerized
)))
begin select 'update will be skipped to save time' end
else begin select 'missing rows will be inserted' end

数据集没有改变,所以在这两种情况下结果都是零/'更新将被跳过',但运行同一查询的这两个版本总是导致第一个版本快速完成,第二个版本大约需要 10-12秒完成。

更新:这是用于比较的查询执行计划的屏幕截图。为什么它们如此不同?这对我来说非常出乎意料。

Query Execution Plans
Detailed Index Scan/Seek performance

更新 2:为了回应评论中的建议,我想提到以下查询的执行与上面的第二个版本相同,执行计划相同并且性能没有增加(即使用“存在”而不是比较计数(* ) 到零没有区别)。
if exists(select 1 from Responses r where r.ResponseID not in (
select ResponseID from data.GamingReport_Computerized
))
begin select 'missing rows will be inserted' end
else begin select 'update will be skipped to save time' end

最佳答案

我以前遇到过这个问题(很多次)。
你能检查你的索引是否是碎片化的(并在必要时对它们进行碎片整理)并且统计数据是最新的吗?
这可能会对性能产生相当大的影响,并且很可能是问题所在(因为查找时间比扫描时间长)。

关于sql - 为什么将 SQL 查询包装在 if 语句中会显着增加其运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22465078/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com