小编acg*_*acg的帖子

Microsoft SQL Server 2016 调用 1000 次的存储过程性能下降

语境 :

小表,存储过程更新表,前两千命中没问题。在第一次点击后,它开始以蜗牛般的速度爬行。此存储过程在我们当前使用调用 C# 应用程序的 SQL Server 2008 R2 环境中没有问题。在我们针对 SQL Server 2016 的新测试环境中,我们看到了这个问题。查询的违规部分处理了一个 where 子句,它对不等于小表更新的参数的列进行了四次比较:

WHERE A.Column1 <> @param1 OR A.Column2 <> @param2     etc..
Run Code Online (Sandbox Code Playgroud)

我的假设是参数嗅探,但已经通过各种查询提示排除了这一点。

我也试过:

  • 更改为选择不更新
  • 玩并行度 (MAXDOP)
  • 更新统计信息并重新编译,甚至在中间进行
  • 索引的各种变化
  • X 次迭代后在调用 C# 代码时重置连接池
  • 删除任何交易控制

似乎可以解决问题的唯一更改是删除 where 子句并将逻辑推送到 setter:

SET A.Column1 = CASE 
        WHEN A.Column1 <> @param1
            THEN @param1
        ELSE A.Column1
        END
Run Code Online (Sandbox Code Playgroud)

我不喜欢更改代码,但我在网上找不到其他资源可以回答为什么 SQL Server 2016 会崩溃。

任何帮助,将不胜感激。

performance sql-server stored-procedures sql-server-2016 query-performance

4
推荐指数
1
解决办法
5273
查看次数