Sql server 在新创建的视图上获得糟糕的性能

Sql server 在新创建的视图上获得糟糕的性能,sql-server,sql-server-2012,query-performance,sql-execution-plan,Sql Server,Sql Server 2012,Query Performance,Sql Execution Plan,我的团队正在将数百个数据库对象从QA服务器移动到UAT服务器。所有新对象都位于UAT数据库中尚不存在的两个模式中 在创建所有这些对象时,我们要做的第一件事是运行一些非常复杂的视图来完成基表的初始数据填充(是的,这些视图编写得很糟糕,将它们作为存储过程编写会更有效,但这不是我问题的重点) 我们的大多数数据负载测试都是在一个数据库中完成的,其中所有对象都已经存在,并且性能良好。最长装载时间为10分钟 但是,当我们将这些新模式/对象移动到另一台服务器上并尝试数据加载时,相同的代码不会在10小时内完成。

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

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

我们的大多数数据负载测试都是在一个数据库中完成的,其中所有对象都已经存在,并且性能良好。最长装载时间为10分钟

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

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

以下是我们尝试过的:

  • 重建所有索引
  • 使用fullscan更新所有统计信息
  • 我们已经验证了SQL Server不会创建超出索引自动创建的任何其他统计信息
  • DBCC FREESYSTEMCACHE('ALL'))
  • 新的环境比我们移植的环境有更好的规格:更多的内核、更多的内存和足够的空间
这些东西会带来一些不同,尽管它仍然没有我们原始环境中的速度快

我错过了什么?除了清理优化器、索引和统计数据之外,还有什么可以驱动性能

我也不明白为什么优化器会为初始数据加载选择一个糟糕的计划,但是,当加载缓慢进行时,如果我在另一个cnn上运行,它会为相同的代码选择一个伟大的计划

SQL版本为SQL 2012,Svc包3

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

编辑:我知道没有人能够生成一段代码来修复我的问题。我很好奇是否有人知道我还没有探索过的地方。示例:

  • 我用来刷新缓存的命令不完整
  • SQL Server在内存中保存我不知道的统计信息(我工作的dba提到了这一点,但没有提供链接,我也没有在网上看到任何信息)
  • 一个链接,解释优化器如何为一个视图选择生成一个平面,然后在另一个cnn上同时为同一个视图选择提供完全不同的平面
  • 我需要考虑的其他类型的指标,我没有提到

我看到过速度更快的硬件运行速度较慢,因为它会遇到在速度较慢的硬件上不会出现的并发问题,特别是在引入更多内核时

检查MAXDOP设置。CXPacket waitis可以指示并行性争用。

这里有太多的可能性,任何类似于答案的东西都是瞎猜。好吧,那么请告诉我我没有涉及的主题。我不认为是:(1)代码差异(2)硬件差异(3)软件差异(4)计划缓存(5)索引差异(6)或缺少统计数据。那么,请告诉我还有什么可以做的。你有没有抓住好的执行计划和坏的执行计划?谁知道呢?这就是问题所在。我们也不知道。它需要一些分析,这意味着像表定义、索引定义、执行计划这样的事情将至少需要。您是如何加载数据的?记住,关于这个问题,我们所知道的只是你发布的内容。听起来你已经涵盖了大多数我们无法提供太多的典型情况,因为我们无法分析这种情况。我不得不同意@SeanLange。虽然您很好地描述了这个问题以及到目前为止所做的尝试,但是如果没有DDL脚本和执行计划,我们就什么也说不出来。