我完全绝望的表现差异,我完全没有线索为什么有一个。
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倍。
一些事实
从本地网络服务器运行完整代码时,差异大约是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" />
答案 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>
也许您的工作站争用较少或虚拟文件系统较简单等。