代码之家  ›  专栏  ›  技术社区  ›  Mongus Pong

为什么更新视图会导致速度加快?

  •  2
  • Mongus Pong  · 技术社区  · 14 年前

    对于特定的查询,我们有一个特殊的情况。

    此查询联接到在某些数据上创建透视的视图。

    现在我们发现有时这个查询运行得很慢(10秒)。我还没有掌握如何持续地复制它运行缓慢。

    但是,当它运行缓慢时,我们可以删除并重新创建加入查询的视图,这将使查询再次快速运行(<1秒)。现在,这个更新视图不会以任何方式更改视图的实际架构。

    我很困惑。你对这里会发生什么有什么想法吗?

    当重新创建一个可以加快查询速度的视图时会发生什么?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Community CDub    7 年前

    这听起来像 parameter sniffing .

    在娱乐方面,这是一个新的目标和新的计划。尽管视图已展开,但查询文本引用的视图与以前的视图不同

        2
  •  0
  •   Vijay Selvaraj    14 年前

    我以前看过这个问题,这是个奇怪的问题。当您重新创建视图时,SQL Server将重新创建视图使用的查询执行计划。随着时间的推移,视图中的查询可能在索引不正确的表上进行了联接,因此索引上的SQL统计数据实际上开始降低性能,而不是帮助它解决问题。因此,一旦您重新创建了视图,SQL Server现在就用给定的统计信息为视图标识最佳的查询执行计划,这就是为什么您看到视图再次运行得更快的原因。然后,一旦表统计数据开始增加,视图的性能就会开始下降,因为SQL Server不知道为视图运行查询执行计划的最佳方法。我建议您检查视图中的表,并调查正在使用的表的联接和索引。如果在其他查询窗口中执行视图的内容,则可以比较该视图运行的查询的估计查询执行计划和该视图使用的估计查询执行计划。通过这个,您可以识别出有问题的查询。