相同服务器上相同代码的不同SQL性能的原因

时间:2015-09-23 11:09:04

标签: sql sql-server performance ssms difference

我完全绝望的表现差异,我完全没有线索为什么有一个。

Overwiew
我的本地计算机上的VMware Workstation v11。我给VM只有2个内核和4GB内存。 Hyper-V Server 2012 R2带有两个6核Xeon(旧版)和64GB内存。只是这个VM运行时与完整的硬件相关联。 参考我在每个VM中启动的CPU基准测试,Hyper-V中的VM应该比我的本地快一倍。

我将我的代码剥离到我在WHILE循环中设置的一个操作来模拟并行查询 - 通常这是由网络服务器完成的。

代码

DECLARE @cnt INT = 1
WHILE @cnt <= 1000
BEGIN
    BEGIN TRANSACTION Trans
        UPDATE [Test].[dbo].[NumberTable]
        SET  Number = Number + 1
        OUTPUT deleted.*
    COMMIT TRANSACTION Trans
    SET @cnt = @cnt + 1;
END

当我在SSMS中执行此操作时,它需要:
VMware Workstation:43s
Hyper-V服务器:59s
...虽然系统速度至少快4倍,但速度大约慢了2倍。

一些事实

  1. DB是相同的 - 备份和恢复
  2. 该表只有1行和13个字段
  3. 该表有3个索引,其中没有一个是&#34; Number&#34;
  4. 登录用户是&#39; SA&#39;
  5. 操作系统相同
  6. SQL Server版本相同(相同的iso)
  7. 安装的SQL Server功能相同
  8. 确保Hyper-V不是瓶颈我还在另一台服务器上安装了VMware ESXi v6,功耗更低 - 结果几乎与Hyper-V-machine相同
  9. SSMS中的
  10. 设置应相同 - 检查两次
  11. 执行计划在每台机器上是相同的 - 只是执行时间不同
  12. 我选择的循环越多,相对时差就越大
  13. 添加当我注释掉OUTPUT行以禁止绘制行(和每个值)时,我的VMware Workstation在1秒内完成,而Hyper-V需要5秒。当我将循环次数增加到2000时,我的VMware Workstation需要再多一次不到1秒,Hyper-V版本需要10秒!
  14. 从本地网络服务器运行完整代码时,差异大约是0.8秒而不是大约9秒! ...不,我没有忘记&#39; 0。&#39; !!

    你能否暗示我到底发生了什么或我能证明什么?

    修改
    我测试了上面的代码没有 OUTPUT-line和 10,000 次传递。除时间统计信息外,两个系统上的客户端统计信息看起来都相同:

    VMware Workstation:

    +-------------------------------+------+--+------+--+-----------+  
    |        Time statistics        | (1)  |  | (2)  |  | (3)       |  
    +-------------------------------+------+--+------+--+-----------+  
    |   Client processing time      | 2328 |  | 1084 |  | 1706.0000 |  
    |   Total execution time        | 2343 |  | 1098 |  | 1720.5000 |  
    |   Wait time on server replies |   15 |  |   14 |  | 14.5000   |  
    +-------------------------------+------+--+------+--+-----------+  
    

    的Hyper-V:

    +-------------------------------+-------+--+------+--+------------+
    |        Time statistics        |  (1)  |  | (2)  |  | (3)        |
    +-------------------------------+-------+--+------+--+------------+
    |   Client processing time      | 55500 |  | 1250 |  | 28375.0000 |
    |   Total execution time        | 55718 |  | 1328 |  | 28523.0000 |
    |   Wait time on server replies |   218 |  |   78 |  | 148.0000   |
    +-------------------------------+-------+--+------+--+------------+
    

    (1):没有输出的10,000次通过
    (2):带OUTPUT的1,000次通过
    (3):意思是

    编辑(适用于 HLGEM
    我比较了两个执行计划,确实存在两个不同之处:

    快速系统:

    <QueryPlan DegreeOfParallelism="1" CachedPlanSize="24" CompileTime="0" CompileCPU="0" CompileMemory="176">
        <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="104842" EstimatedPagesCached="26210" EstimatedAvailableDegreeOfParallelism="2" />
    

    系统慢:

    <QueryPlan DegreeOfParallelism="1" CachedPlanSize="24" CompileTime="1" CompileCPU="1" CompileMemory="176">
      <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="524272" EstimatedPagesCached="655341" EstimatedAvailableDegreeOfParallelism="10" />
    

3 个答案:

答案 0 :(得分:0)

您是否完全检查了硬件? 它看起来像OUTPUT运算符花一些时间向您显示数据。 https://msdn.microsoft.com/en-us/library/ms177564%28v=sql.120%29.aspx

答案 1 :(得分:0)

时差取决于很多事情。本地服务器可能更快,因为您没有通过完整的网络管道发送数据。在每台服务器上同时发生的其他工作可能会影响速度。

通常在开发中很少或没有其他工作负载,事情可能比Prod更快,因为有数千名用户在同一时间尝试事物。这就是为什么如果你有一个大型系统,负载测试很重要。

您没有提到索引,但在不同的服务器上也可能有所不同(即使它应该是相同的!)。所以至少检查一下。

查看执行计划,看看能否找到差异。过时的统计数据也可能导致执行计划不够理想。

其中一台服务器是否运行数据库以外的应用程序?这可能会限制服务器可供数据库使用的内存量。

老实说,这是一个很大的话题,你应该检查很多东西。如果您正在进行此类分析,我建议您购买一本性能调优书并仔细阅读,以确定哪些因素会对此产生影响。这不是互联网上的问题可以轻易回答的问题;你需要深入了解一些知识。

答案 2 :(得分:0)

查询速度与CPU /内存速度关系不大,尤其是更新数据的查询。

查询速度主要受磁盘I / O速度的限制,这比CPU / RAM速度至少慢1000倍。更快地进行查询最终是避免不必要的磁盘I / O,但是您的查询必须读取和写入每一行。

VM框(可能)使用映射到磁盘上文件的虚拟驱动器,可能需要做一些努力才能保持两者对齐,甚至可能是异步,而其他进程正在运行并与驱动器竞争。 / p>

也许您的工作站争用较少或虚拟文件系统较简单等。