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

时间:2019-01-30 13:01:32

标签: c++ sql-server ssms c++builder

我有一个存储过程,该过程返回一组8个integer值。最初,所有操作似乎都以正确的方式执行,但是在执行某些操作后,当我使用TADOQuery在C ++代码中执行代码时,执行时间会增加,但在SSMS中执行时间仍然正确。

在第一步中,我尝试发展我的存储过程以使其更加了解性能。我赢得了一些执行时间,但问题仍然存在。

我也尝试检查我的代码搜索一些荒谬的行,这些行可能会延长执行时间。但是我将相同的代码与其他存储过程一起使用,它们没有显示出相同的效果。

因此,我使用SQL事件探查器查看到底发生了什么。在下面,您可以看到好的执行和坏的执行之间的区别。


执行良好

 CPU | Reads | Writes | Duration 
 93  | 13657 | 0      | 113


执行不良

 CPU      | Reads    | Writes | Duration
 22090    | 31960629 | 0      | 25158

您可以看到读取值和cpu访问量呈指数增长。

如果我在SSMS查询编辑器中执行相同的存储过程,结果将直接进入良好的执行状态。

我只希望我的存储过程总是以差不多相同的持续时间执行,而不管我在哪里执行查询。

2 个答案:

答案 0 :(得分:1)

已经看过几次了-它吸引了我们很多人。根据您的呼叫检查设置,以查看诸如ansi nulls on / off,其他设置等情况。类似的更改导致执行计划不同。看到 SQL faster in ssms than in application了解详情。

答案 1 :(得分:0)

问题出在执行计划中。

编译存储过程时,将基于实际数据确定新计划。几次执行后,该计划就过时了,因为数据经常更改。

因此,要解决此问题,我对存储过程使用了WITH RECOMPILE选项。我认为这不是最好的解决方案,但是它解决了问题,现在我没有查询超时了。

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