我有 2个相同的VM (16个vCPU,RAM:64GB),具有相同的数据库,相同的表和视图以及相同的行数。 View1有4.7M行。
在VM1(UAT)上,SELECT TOP 1000 .. FROM View1
在不到1秒的时间内回答。
在VM2(PROD)上,相同的查询在4分钟内回答。
我检查了数据库,表,view1的属性,但没有发现VM1和VM2之间有任何区别。 我已经检查了统计数据,但它显示没有必要进行任何修改。
VM2上的执行计划显示:
在VM1上:
VM2(PROD)的问题可能与VM1(UAT)完全相同?
以下是两个VM上的“SELECT TOP 1000 .. FROM View1”的执行计划:
Execution plans on both VM: UAT and PROD
他们似乎非常相似。
以下是UAT与PROD统计数据:
什么可以解释两种环境之间逻辑读取(和预读读取)数量的巨大差异???
通过提前,感谢帮助我理解这个“神秘”。
答案 0 :(得分:1)
尽管两个不同的VM具有相同的配置,但它有很多不同之处:
从View1
中选择前1000名中的10 MB / s
60GB / 64GB分配给" SQL Server 2014"在两个VM上
没有DBA"手头",我希望他下周回来
请问,如何强制统计更新?在两个VM上,最后一次更新是 1.5个月前!但它说统计数据是最新的......
测试通过"终端服务器"在VM1和VM2上完成。使用" SQL 服务器管理工作室"。网络活动期间非常低 测试VM2
理论上不是......也许。我会在他和DBA见面的时候看到他 回来。
第3点和第4点对估计和实际执行次数及其差异至关重要。
关于View1的其他信息:它使用2个表 - view0:4.7M行,没有 性能问题(选择前1000< 1 s。) - table2:3行
在VM2上测试View1期间,使用100%的1个CPU。
是否有工具来比较2个数据库及其数据库的quiclky参数 组件(表,视图,索引......)?
感谢您的帮助! :)
对于第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
按以下百分比重建或重组索引:
avg_fragmentation_in_percent value纠正声明
5%且< = 30%ALTER INDEX REORGANIZE 30%ALTER INDEX REBUILD(ONLINE = ON)*
https://msdn.microsoft.com/en-us/library/ms189858.aspx
第4点:
您可以在以下脚本中运行:
update statistics yourtablename
这将更新您的统计信息。之后,您可以使用
检查统计直方图dbcc show_statistics(yourtablename, yourindexname)
它在两个服务器中均匀分布,使查询优化器能够选择最佳计划。
考虑到两个执行计划都是相似的。如果您发布两个执行计划,我们可以找到确切的差异。