在我的代码中执行存储过程时出现问题

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 选项。我认为这不是最好的解决方案,但它解决了问题,现在我不再有查询超时了。

通过这种方式,我尝试了一些其他解决方案以在最佳时刻应用重新编译,但唯一有效的解决方案是使用此选项。