在 SQL Server 上查询速度很快,但在 PHP 上查询速度较慢

问题描述 投票:0回答:2

我们决定将 MS SQL Server 2014 数据库迁移到运行 2016 的另一台服务器中。现在,使用该数据库的 PHP 应用程序的性能已显着降低(查询从 1 或 2 秒跃升至 20 秒),尽管数据库在模式、结构和数据方面是相同的。新服务器具有更高的CPU、磁盘和内存参数,工作负载也很正常,因此这种性能下降一开始是没有意义的。

然后我使用 Profiler 分析了一些查询,我惊讶地发现查询计划在 Management Studio(快,1 到 3 秒)或应用程序前端(慢,15 到 25 秒)中运行时是不同的.

我找到了这个link,还有this其他,但是在阅读了很多内容并尝试了不同的东西之后,我无法解决这个问题。以前有人处理过这个吗?关于深入潜水之前需要快速检查的事项有什么提示吗?

谢谢!

============

编辑1

查询仅返回几条记录,具体取决于过滤器的值,但会返回 10 和 1000 条记录(永远不会超过这个记录,因为它最高可达 1000 条)。 正在查询的主表包含 100 万条记录,数量不多,整个 DB 大小约为 4 GB。 索引已成功迁移,然后重建并更新统计信息。

编辑2

我尝试过的事情是重建所有数据库索引并更新所有数据库表统计信息。我也强制重新编译了几次(仅从 Management Studio)。我使用索引提示强制使用某些索引(仅来自 Management Studio)。 这些都没有帮助我解决问题。 关于查询计划,它们非常难以分析,因为我的查询连接了大约 20 个表,并且有几个子查询。

编辑3

澄清一下,即使有参数,产生不同执行计划的查询也是相同的。我的意思是,我在探查器跟踪处于活动状态时从前端运行查询,捕获查询(大约需要 20 秒),然后复制文本并将其粘贴到管理工作室中,运行相同的查询并在中获取结果只需 2 秒,再加上不同的执行计划。这种问题还和参数嗅探有关吗?

php sql-server performance database-performance sql-execution-plan
2个回答
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 

0
投票

您需要提取两个执行计划:快速和慢速的执行计划并进行比较,您应该检查构建这些计划的嗅探参数; 如果您发现具有不同参数的相同查询有不同的计划,您可以使用选项(重新编译)或考虑按照 Sommarskog 的文章中所述重写代码。 您不应该更改 atirhabort 或其他会话选项,因为在这种情况下不同计划的原因是优化查询的不同参数;不同的会话选项只会导致服务器嗅探不同的参数,因为新计划已构建

© www.soinside.com 2019 - 2024. All rights reserved.