查询执行时间异常

时间:2015-11-12 16:01:09

标签: sql sql-server performance sql-server-2008-r2

我在两个不同的环境中执行相同的查询

  • 第一个环境有4GB RAM和一个Intel处理器3,09 Ghz。
  • 第二个环境有32GB RAM和AMD处理器2,20 Ghz。

我想知道为什么查询在第一个环境中执行需要6分钟,在第二个环境中执行需要很多个小时。

我通过执行下面的查询来检查为sql server分配的内存,这两个环境具有相同的值。

SELECT value_in_use
FROM sys.configurations
WHERE name = 'max server memory (MB)'

查询在第二个环境中花费太多时间的原因是什么?

PS:两个环境中的行数相同(约2百万)

1 个答案:

答案 0 :(得分:2)

有几个因素会使结果不同。我不愿意提及它们,因为它们是人们倾向于拒绝的那种东西,但我已经经历过所有这些并且有一些被msft确认。

首先,建议您查看执行计划的人是在正确的轨道上。这可能至少可以为您提供一个与众不同的线索。

原因(假设数据的大小和内容相同)

  1. 两台服务器的统计信息不同,导致执行计划不同。
  2. 硬件性能不同。更慢或更快的CPU(例如,不同的生成,即使时钟速度接近),更慢或更快的磁盘。更多核心与一个核心(导致并行计划与串行计划)
  3. 硬件配置不同(例如,性能差异)。一个使用SAN直接存储。有时很重要。一旦数据在缓存中,有时没有区别。
  4. 数据存储在物理上是不同的。一台服务器在您关注的表或索引中具有极其碎片化和稀疏的数据块/页面。一个紧凑而快速。这可能是由于用于在两个系统中加载数据的不同方案而发生的。
  5. SQLServer配置设置:例如,在一个系统上配置有限内存。
  6. 其中一个系统上的竞争工作负载。
  7. 缺少或不同的索引。
  8. 不同的归类设置会导致不同的索引统计信息和不同的计划。
  9. 软件版本略有不同。
  10. 数据大小大致相同,但内容不同,更改了查询计划。
  11. 所涉及的时差表明最有可能采用不同的执行计划。

    如果所有其他内容(索引等)相同,则有时强制SQLServer重新运行统计信息,然后再次尝试查询。过去,SQLServer根据表中数据的更改量自动更新统计信息。有时这会导致暂时不好的统计信息,因为一个表达到更新的阈值但其他表没有,并且优化器选择了错误的计划。这一切似乎都是不太可能的,但我曾经构建过一个定期解决这个问题的产品,并且很幸运能够访问MSFT SQLServer开发人员帮助我证明这一点。

    另一个真正打击我的是缓慢的san或慢VMWare环境。 Sans经常被声称速度很快,但由于网络连接速度慢或工作负载相互竞争,导致实际用户表现糟糕。 VMWare或其他虚拟化环境通常会导致同样的问题,尤其是在不想弄清楚哪些工作负载到达其集群的大型组织中。别人的工作量会影响你的工作量。所以性能测试失去了意义。

    我的钱正在改变计划的一些因素,如数据内容,统计数据,索引配置。