SQL 服务器存储过程 RPC 与 SSMS

SQL Server Stored Procedure RPC VS SSMS

我有一个带 1 个参数的存储过程。当我 运行 来自 SQL Server Management Studio 的存储过程时,它会在 2-4 秒内 运行s。当我使用控制台应用程序调用它时,需要 30 多秒。 SQL 服务器是远程服务器,SSMS 和我的应用程序都是从我的本地计算机 运行 获取的,因此我认为这不是网络问题。

我已经 运行 SQL Server Profiler 试图追踪问题,我看到的一件事是,当它来自 SSMS 运行 时,它会启动语句,重新编译它,然后重新开始,然后完成它,像这样:

SP:StmtStarting
SP:Recompile
SQL:StmtRecompile
SP:StmtStarting
SP:StmtCompleted

2 个重新编译条目的 EventSubClass 为“2 - 统计信息已更改”

在应用程序中,我只看到 SP:StmtStarting 和 SP:StmtCompleted 的条目,没有重新编译的条目。

我正在调用具有相同参数值的完全相同的存储过程。为什么 SSMS 会根据统计信息重新编译,但我的控制台应用程序不会?

经过研究和故障排除后,这似乎完全是由于 SET_ARITHABORT_ON。 SSMS 默认为 'ON' 而 .net sql 客户端默认为 'OFF' 所以它有 2 个不同的执行计划,虽然我不完全确定为什么这两个计划如此截然不同。

我覆盖了 OpenConnection() 方法以打开连接并将其设置为 ON,然后我的应用程序具有与 SSMS 相同的性能。我希望这对偶然发现此问题的其他人有所帮助。