我们的一个应用程序导致了一个问题,因为有一个存储过程在 SSMS 中返回正常,不到 1 秒,但在应用程序中它最多需要 10 分钟,具体取决于所使用的参数。任何参数组合在 SSMS 中都可以正常工作,执行计划对我来说看起来不错。
但是,在分析应用程序时,显然使用了不同的、效率较低的计划。用于连接的 SqlClient 具有 ARITHABORT 设置,设置为 OFF,当在 SSMS 中复制时,我遇到了相同的性能问题。
我猜 ARITHABORT OFF 将不允许优化器使用缓存的计划?还是它运行一个单独的计划?
根据 Apps 人员的说法,无法更改 SQLClient 连接以使用 ARITHABORT ON
我猜这里的 ARITHABORT 设置有点用词不当,它实际上是优化器没有使用好计划引起的参数嗅探?
无论如何我都需要强制它使用一个好的计划,那么如何最好地解决这个问题呢?我是否以某种方式创建计划指南或优化存储过程?
这是 SQL Server 2008R2 SP2。
您可能遇到了参数嗅探问题。事实上,您使用不同的设置执行查询
ARITHABORT
会使 SQL Server 创建一个新的计划,而不是重用现有的计划,因为该设置是缓存键的一部分。看看Slow in the application, fast in SSMS,它有很多信息,例如:
如果您可以更改存储过程,我会尝试在那里修复它,而不是使用计划指南。可能的解决方案也在链接文章中进行了说明,但基本上您有以下选择: