Sql server SQL server 2014:同一虚拟机的不同性能(大量执行)

Sql server SQL server 2014:同一虚拟机的不同性能(大量执行),sql-server,performance,sql-server-2014,Sql Server,Performance,Sql Server 2014,我有两个相同的VM(16个vCPU,RAM:64GB),具有相同的数据库、相同的表和视图以及相同的行数。View1有4.7米的线条 在VM1(UAT)上,a选择前1000名。。从视图1在不到1秒的时间内回答问题 在VM2(PROD)上,相同的查询在4分钟内回答 我检查了数据库、表、视图1的属性,并没有发现VM1和VM2之间有任何区别。 我检查了统计数据,但它显示没有什么需要重新刷新的 VM2上的执行计划显示: 估计处决人数:1 000 处决人数:420万 在VM1上: 估计处决人数:1 0

我有两个相同的VM(16个vCPU,RAM:64GB),具有相同的数据库、相同的表和视图以及相同的行数。View1有4.7米的线条

在VM1(UAT)上,a
选择前1000名。。从视图1
在不到1秒的时间内回答问题

在VM2(PROD)上,相同的查询在4分钟内回答

我检查了数据库、表、视图1的属性,并没有发现VM1和VM2之间有任何区别。 我检查了统计数据,但它显示没有什么需要重新刷新的

VM2上的执行计划显示:

  • 估计处决人数:1 000
  • 处决人数:420万
在VM1上:

  • 估计处决人数:1 000
  • 处决人数:900
VM2(PROD)与VM1(UAT)完全相同的问题是什么

以下是两个虚拟机上“从视图1中选择TOP 1000..”的执行计划:

他们似乎非常相似

以下是UAT与产品统计数据:

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


提前感谢您帮助我理解这个“谜团”。

尽管它是两个不同的虚拟机,具有相同的配置,但它有很多不同之处:

  • 您是否检查了两台服务器中的IOPS数
  • 在选择前1000名期间,速度为10 MB/s。。。从视图1

  • 即使两个RAM相同,分配给SQL Server的内存量是多少
  • 在两个虚拟机上为“SQL Server 2014”分配了60GB/64GB

  • 数据加载模式:数据加载是如何发生的,索引是如何重建/重新组织的?计划是什么
  • 没有DBA“在手”,我希望他下周回来

  • 统计信息更新:尽管重建了索引,但统计信息在两个服务器中是否都是最新的
  • 请问,如何强制统计更新?在这两个虚拟机上,上次更新是 1.5个月前!但它说统计数据是最新的

  • 网络测试是如何工作的?如果从远程计算机进行查询,是否存在任何连接问题
  • 测试通过带有“SQL”的“终端服务器”在VM1和VM2上完成 服务器管理工作室”。在这段时间里,网络活动非常少 VM2上的测试

  • 在你不知道的情况下,在同一张表上有没有额外的触发器和约束
  • 理论上不是但是。。。也许。我会和DBA商量他什么时候回来 回来

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

    关于View1的其他信息:它使用2个表-view0:4.7M行,无 性能问题(选择顶部1000<1秒)-表2:3行

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

    有没有工具可以比较两个数据库的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;  
    
    update statistics yourtablename
    
    UAT和PROD的结果

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

    平均碎片百分比值修正语句

    5%和<=30%改变索引重组 30%更改索引重建(联机=打开)*

    关于第4点:

    您可以运行以下脚本:

    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;  
    
    update statistics yourtablename
    
    这将更新您的统计数据。之后,您可以使用

    dbcc show_statistics(yourtablename, yourindexname)
    
    它在两台服务器中分布均匀,使得查询优化器能够选择最佳计划


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

    您可以添加完整的执行计划吗?完成!希望能有所帮助:)更新了第3点和第4点的详细信息。您好,我已经更新了统计数据,并且有相同的性能问题。Kannan的回答非常好。我看不懂法语,但我猜它是在扫描而不是在表上搜索,所以我会在有问题的表上重建索引(这有更新统计数据的良好副作用)。在您的计划中,“Dataxyz_GeoLoc_Input”表只扫描UAT中的1000条记录,而它会扫描4665284的同一个表。该表在这两种环境中实际有多少条记录?还有为什么它会进行表扫描,如果您有聚集索引或非聚集索引,它会进行索引扫描,这可能会更快。。。此外,我没有看到任何过滤器应用于这两个计划。。。