【问题标题】:SQL server 2014: different performances (huge "number of executions") with same VMsSQL Server 2014:具有相同 VM 的不同性能(巨大的“执行次数”)
【发布时间】:2017-04-02 12:01:03
【问题描述】:

我有 2 个相同的 VM(16 个 vCPU,RAM:64GB),具有相同的数据库、相同的表和视图以及相同的行数。 View1 有 470 万行。

在 VM1 (UAT) 上,SELECT TOP 1000 .. FROM View1 会在不到 1 秒的时间内回答。

在 VM2 (PROD) 上,相同的查询在 4 分钟内得到答复。

我检查了数据库、表、view1 的属性,没有发现 VM1 和 VM2 之间有任何区别。 我检查了统计数据,但它表明无需刷新任何内容。

VM2 上的执行计划显示:

  • 估计执行次数:1000
  • 执行次数:4.2M

在 VM1 上:

  • 估计执行次数:1000
  • 执行次数:900

应该与 VM1 (UAT) 完全相同的 VM2 (PROD) 可能存在什么问题?

这是两个 VM 上“SELECT TOP 1000 .. FROM View1”的执行计划:

Execution plans on both VM: UAT and PROD

它们看起来非常相似。

这是 UAT 与 PROD 的统计数据:

什么可以解释两种环境之间逻辑读取(和预读)数量的巨大差异???

提前感谢您帮助我了解这个“奥秘”。

【问题讨论】:

  • 可以添加完整的执行计划吗?
  • 完成!希望它可以帮助:)

标签: sql-server performance sql-server-2014


【解决方案1】:

虽然是两个不同的虚拟机,配置相同,但还是有很多不同:

  1. 您是否检查了两个服务器中的 IOPS 数?

10 MB/s 在从 View1 中选择前 1000 个 ...

  1. 尽管两个 RAM 相同,但它分配给 SQL Server 多少?

为两个 VM 上的“SQL Server 2014”分配 60GB/64GB

  1. 数据加载模式:如何加载数据以及如何重建/重新组织索引?时间表是什么?

“手头上”没有 DBA,我希望他下周回来

  1. 统计信息更新:即使您已重建索引,两个服务器中的统计信息是否都是最新的?

请问,如何强制更新统计信息?在两个 VM 上,最后一次更新是 1.5 个月前!但它说统计数据是最新的......

  1. 网络测试如何工作?如果您从远程机器查询,是否存在任何连接问题?

测试是在 VM1 和 VM2 上通过“终端服务器”和“SQL Server Management Studio"。网络活动在此期间非常低 在 VM2 上测试

  1. 在您不知情的情况下对同一张表有任何额外的触发器、约束吗?

理论上不会,但……也许吧。我会和 DBA 一起看看他什么时候 返回。

第 3 点和第 4 点对于估计的和实际的处决数量及其差异至关重要。

关于 View1 的附加信息:它使用 2 个表 - view0:4.7M 行,没有 性能问题(选择前 1000

在 VM2 上测试 View1 时,使用了 1 个 CPU 的 100%。

是否有工具可以比较 2 个数据库的快速参数及其 组件(表、视图、索引...)?

感谢您的帮助! :)

对于第 3 点:您可以执行以下脚本:

SELECT a.index_id, name, avg_fragmentation_in_percent  
FROM sys.dm_db_index_physical_stats (DB_ID(N'YourDatabase'), OBJECT_ID(N'YourTable'), NULL, NULL, NULL) AS a  
    JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;  

UAT 和 PROD 的结果

Results UAT & PROD

按照以下百分比进行索引重建或重组:

avg_fragmentation_in_percent value 修正说明

5% 和

https://msdn.microsoft.com/en-us/library/ms189858.aspx

对于第 4 点:

你可以运行下面的脚本:

update statistics yourtablename

这将更新您的统计信息。之后,您可以使用

检查统计直方图
dbcc show_statistics(yourtablename, yourindexname)

它在两个服务器中均匀分布,这使得查询优化器可以选择最佳计划。

考虑到两个执行计划是相似的。如果您发布两个执行计划,我们可以找到确切的区别。

【讨论】:

  • 更新了第 3 点和第 4 点的详细信息。
  • 您好,我已经更新了统计数据并且遇到了同样的性能问题。
  • 卡南的出色回答。我看不懂法语,但我猜它会扫描而不是在表上查找,所以我会重建有问题的表上的索引(这具有更新统计数据的良好副作用)。
  • 在您的计划中,“Dataxyz_GeoLoc_Input”表的表扫描仅针对 UAT 中的 1000 条记录,而它对 4,665,284 的同一表进行表扫描。该表在两种环境中实际上有多少条记录?还有为什么它会进行表扫描,如果您有聚集索引或非聚集索引,它会进行可能更快的索引扫描......而且我没有看到在这两个计划中应用了任何过滤器......
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多