在新创建的视图中获得可怕的性能

时间:2016-08-25 19:47:03

标签: sql-server sql-server-2012 query-performance sql-execution-plan

我的团队正在将数百个数据库对象从我们的QA服务器移动到我们的UAT服务器。所有新对象都有两个模式,这些模式在UAT数据库中尚不存在。

我们在创建所有这些对象时所做的第一件事是运行一些非常复杂的视图来执行基表的初始数据填充(是的,视图编写得很糟糕,将它们写成存储会更有效率过程,但这不是我的问题的主旨。)

我们的大多数数据负载测试都是在已存在所有对象的数据库中完成的,并且性能良好。最长的负载是十分钟。

但是,当我们将这些新模式/对象移动到不同的服务器上并尝试加载数据时,相同的代码在10小时内完成。但是,如果我们尝试单独运行底层视图,当我们等待视图的第一次练习完成时,它会非常快。

很明显这是优化器的问题(我们已经验证了服务器之间的代码完全相同:我们并没有错过任何索引或统计信息)。如果我们取消长时间运行的查询并重新启动它们,那么性能将与QA匹配。

以下是我们尝试的内容:

  • 重建所有索引。
  • 使用fullscan更新所有统计信息。
  • 我们已经验证SQL Server没有创建超出索引自动创建的任何其他统计信息。
  • DBCC FREESYSTEMCACHE(' ALL')
  • 新环境的规格要比我们提供的更好:更多内核,更多内存,充足的空间。

这些东西有所不同,尽管它仍然没有我们原始环境那么快。

我在这里缺少什么?除了清理优化器,索引和统计数据之外,还有什么可以推动性能?

我也不明白为什么优化器为初始数据加载选择了一个可怕的计划,但是,当负载正在爬行时,如果我在另一个cnn上运行它,它会为相同的代码选择一个很好的计划

SQL版本是SQL 2012,Svc Pack 3.

=========================

编辑:我知道没有人能够生成一段修复我的问题的代码。如果有人知道我还没有探索过的一个区域,我很好奇。例子:

  • 我用来刷新缓存的命令不完整。
  • SQL Server保留了我不知情的内存统计信息(我提到的dba提到了这个,但没有提供链接,我也没有在网上看到任何内容)。
  • 一个链接,解释优化器如何为视图选择生成一个计划,但随后为另一个cnn提供完全不同的计划,以便同时选择相同的视图。
  • 我还没有提及的其他类型的指标。

1 个答案:

答案 0 :(得分:1)

我发现更快的硬件运行速度更慢,因为它可以解决在速度较慢的硬件上不会出现的并发问题,尤其是在引入更多内核时。

检查您的MAXDOP设置。 CXPacket等待可以指示并行性争用。 https://www.brentozar.com/archive/2013/08/what-is-the-cxpacket-wait-type-and-how-do-you-reduce-it/