在我的代码中执行存储过程时出现问题
Problem executing stored procedure in my code
我有一个存储过程 returns 一组 8 个 integer
值。一开始一切似乎都以正确的方式执行,但是当我使用 TADOQuery
在我的 C++ 代码中执行它时,执行了一些执行时间后,执行时间增加了,但在 SSMS 中却没有,因为执行时间仍然正确。
第一步,我尝试改进我的存储过程,使其更注重性能。我赢得了一些执行时间,但问题仍然存在。
我还尝试检查我的代码,搜索一些可能会延长执行时间的荒谬行。但是我在其他存储过程中使用了相同的代码,但它们并没有显示相同的效果。
所以我使用 SQL Profiler 来查看到底发生了什么。下面你可以看到好的执行和坏的执行之间的区别。
执行力不错
CPU | Reads | Writes | Duration
93 | 13657 | 0 | 113
执行不当
CPU | Reads | Writes | Duration
22090 | 31960629 | 0 | 25158
如您所见,读取值和 cpu 访问量呈指数级增长。
如果我在 SSMS 查询编辑器中执行相同的存储过程,结果将直接执行良好。
我只希望无论在何处执行查询,我的存储过程总是以大致相同的持续时间执行。
这个已经看过好几次了 - 它吸引了我们很多人。根据您的要求检查设置,例如 ansi nulls on/off、其他设置等。这样的更改会导致不同的执行计划。看
SQL faster in ssms than in application 了解详情。
问题出在执行计划上。
在编译存储过程时,根据实际数据确定新的方案。执行几次后,计划就变旧了,因为数据经常变化。
因此,为了解决这个问题,我对存储过程使用了 WITH RECOMPILE 选项。我认为这不是最好的解决方案,但它解决了问题,现在我不再有查询超时了。
通过这种方式,我尝试了一些其他解决方案以在最佳时刻应用重新编译,但唯一有效的解决方案是使用此选项。
我有一个存储过程 returns 一组 8 个 integer
值。一开始一切似乎都以正确的方式执行,但是当我使用 TADOQuery
在我的 C++ 代码中执行它时,执行了一些执行时间后,执行时间增加了,但在 SSMS 中却没有,因为执行时间仍然正确。
第一步,我尝试改进我的存储过程,使其更注重性能。我赢得了一些执行时间,但问题仍然存在。
我还尝试检查我的代码,搜索一些可能会延长执行时间的荒谬行。但是我在其他存储过程中使用了相同的代码,但它们并没有显示相同的效果。
所以我使用 SQL Profiler 来查看到底发生了什么。下面你可以看到好的执行和坏的执行之间的区别。
执行力不错
CPU | Reads | Writes | Duration
93 | 13657 | 0 | 113
执行不当
CPU | Reads | Writes | Duration
22090 | 31960629 | 0 | 25158
如您所见,读取值和 cpu 访问量呈指数级增长。
如果我在 SSMS 查询编辑器中执行相同的存储过程,结果将直接执行良好。
我只希望无论在何处执行查询,我的存储过程总是以大致相同的持续时间执行。
这个已经看过好几次了 - 它吸引了我们很多人。根据您的要求检查设置,例如 ansi nulls on/off、其他设置等。这样的更改会导致不同的执行计划。看 SQL faster in ssms than in application 了解详情。
问题出在执行计划上。
在编译存储过程时,根据实际数据确定新的方案。执行几次后,计划就变旧了,因为数据经常变化。
因此,为了解决这个问题,我对存储过程使用了 WITH RECOMPILE 选项。我认为这不是最好的解决方案,但它解决了问题,现在我不再有查询超时了。
通过这种方式,我尝试了一些其他解决方案以在最佳时刻应用重新编译,但唯一有效的解决方案是使用此选项。