【问题标题】:Execution Plan differences between Select and a ViewSelect 和 View 之间的执行计划差异
【发布时间】:2014-10-19 02:25:16
【问题描述】:

我创建了一个对产品表执行一些查询逻辑的视图。当我从那个视图中选择像

Select * from dbo.productView where productID = UUID

执行计划效率极低。但是,如果我使用生成视图的查询并将 where 子句添加到其中,则执行计划非常有效。为什么这些会产生如此径向不同的执行计划。我认为在普通视图(未索引)的情况下,查询分析器会扩展视图,因此实际上它就像将 where 子句添加到组成视图的 SELECT 中一样。

我不能只索引 productView,因为它使用 CTE 和窗口函数,但我希望查询分析器能够生成性能更高的执行计划,例如从普通选择中。

【问题讨论】:

  • 尝试将option (recompile)添加到每个sql语句的末尾,然后再次比较计划。
  • 需要更多细节,但可能是stackoverflow.com/q/13635531/73226的欺骗
  • 永远不要以“只为 productView 编制索引”的方式来考虑它——索引并不是您添加到任何视图以使其更快的神奇事物。 Egads 我需要写博客。

标签: sql sql-server query-optimization sql-execution-plan


【解决方案1】:

我认为在普通视图(未索引)的情况下,查询分析器 会扩大视野

这是真的。尽管如此,这两个查询变体具有不同的执行计划缓存槽。很可能,您在重用一个嗅探到错误参数值的旧计划时很不走运。

获取新的计划。清除测试系统上的缓存或添加RECOMPILE 提示。计划现在将是相同的。

要解决此问题,请应用解决不良计划和参数嗅探的常用技术。

【讨论】:

  • 从提到窗口函数来看,他们可能遇到了here 中描述的谓词推送问题
猜你喜欢
  • 2011-02-10
  • 2012-03-14
  • 2014-10-14
  • 2021-06-16
  • 1970-01-01
  • 2021-07-04
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多