我们决定将MS SQL Server 2014数据库迁移到运行2016的不同服务器。现在使用此数据库的PHP应用程序显着降低了性能(查询从1秒或2秒跳到20秒),尽管DB在架构,结构和数据方面是相同的。新服务器具有更高的CPU,磁盘和内存参数,工作负载正常,因此这种性能下降在一开始就毫无意义。 然后我用Profiler分析了一些查询,我惊讶地发现查询计划在Management Studio(快速,1到3秒)或应用程序前端(慢速,15到25秒)中运行时有所不同。 我也发现了这个link和this,但经过大量阅读并尝试了不同的事情,我无法解决问题。以前有人处理过这个吗?在潜水之前有关于快速检查的任何提示吗?
谢谢!
============
编辑1
查询只返回几条记录,具体取决于过滤器的值,但是10和1000(从不超过1000,因为它超过了1000)。 被查询的主表包含100万条记录,不多,整个数据库的权重大约为4 GB。 索引已成功迁移,然后重建和统计更新。
编辑2
我尝试过的事情是重建所有数据库索引并更新所有数据库表统计信息。我也多次强制使用RECOMPILE(仅限Management Studio)。我使用索引提示强制使用某些索引(仅限Management Studio)。 这些都没有帮助我解决这个问题。 关于查询计划,它们非常难以分析,因为我的查询加入了大约20个表并且有几个子查询。
编辑3
为了澄清,产生不同执行计划的查询甚至与参数相同。我的意思是,当探测器跟踪处于活动状态时,我从前端运行查询,捕获查询(大约需要20秒),然后复制文本并将其粘贴到管理工作室中,运行相同的查询并获得结果只需2秒,再加上不同的执行计划。这类问题是否仍与参数嗅探有关?
答案 0 :(得分:0)
这可能是因为数据库中的ArithAbort属性已关闭。另请参阅http://www.sommarskog.se/query-plan-mysteries.html
您可以使用这个小脚本检查并更正
declare @value sql_variant
select @value = SESSIONPROPERTY('ARITHABORT')
if @value <> 1
begin
USE master
ALTER DATABASE [your_database] SET ARITHABORT ON WITH NO_WAIT
use your_database
end
答案 1 :(得分:0)
您需要提取两个执行计划:快速和慢速执行计划并进行比较,您应该检查构建这些计划的嗅探参数; 如果你找到不同参数的相同查询的不同计划,你可以使用选项(重新翻译)或考虑重写代码,如Sommarskog的文章中所述。 您不应该更改atirhabort或其他会话选项,因为在这种情况下,不同计划的原因是针对其优化查询的不同参数;不同的会话选项只会导致服务器嗅探不同的参数,因为新计划是构建