我的团队正在将数百个数据库对象从我们的QA服务器移动到我们的UAT服务器。所有新对象都有两个模式,这些模式在UAT数据库中尚不存在。
我们在创建所有这些对象时所做的第一件事是运行一些非常复杂的视图来执行基表的初始数据填充(是的,视图编写得很糟糕,将它们写成存储会更有效率过程,但这不是我的问题的主旨。)
我们的大多数数据负载测试都是在已存在所有对象的数据库中完成的,并且性能良好。最长的负载是十分钟。
但是,当我们将这些新模式/对象移动到不同的服务器上并尝试加载数据时,相同的代码在10小时内完成。但是,如果我们尝试单独运行底层视图,当我们等待视图的第一次练习完成时,它会非常快。
很明显这是优化器的问题(我们已经验证了服务器之间的代码完全相同:我们并没有错过任何索引或统计信息)。如果我们取消长时间运行的查询并重新启动它们,那么性能将与QA匹配。
以下是我们尝试的内容:
这些东西有所不同,尽管它仍然没有我们原始环境那么快。
我在这里缺少什么?除了清理优化器,索引和统计数据之外,还有什么可以推动性能?
我也不明白为什么优化器为初始数据加载选择了一个可怕的计划,但是,当负载正在爬行时,如果我在另一个cnn上运行它,它会为相同的代码选择一个很好的计划
SQL版本是SQL 2012,Svc Pack 3.
=========================
编辑:我知道没有人能够生成一段修复我的问题的代码。如果有人知道我还没有探索过的一个区域,我很好奇。例子:答案 0 :(得分:1)
我发现更快的硬件运行速度更慢,因为它可以解决在速度较慢的硬件上不会出现的并发问题,尤其是在引入更多内核时。
检查您的MAXDOP设置。 CXPacket等待可以指示并行性争用。 https://www.brentozar.com/archive/2013/08/what-is-the-cxpacket-wait-type-and-how-do-you-reduce-it/