sql - Select 和 View 之间的执行计划差异

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

我制作了一个 View ,该 View 对产品表执行一些查询逻辑。当我从那个 View 中选择时

Select * from dbo.productView where productID = UUID

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

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

最佳答案

I thought in the case of normal views (not indexed) the query analyzer would expand the view

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

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

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

关于sql - Select 和 View 之间的执行计划差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494335/

相关文章:

mysql - 使用多个 JOIN 进行查询优化

mysql - 仅选择多个结果集中的行

.net - Crystal Reports 2008 和 .mdf 文件有哪些先决条件

sql - 数据库切换时出现错误 'Grid index out of range'

sql-server - 显式锁定 SQL Server 中的表?

sql-server - 如何让SQL Server知道不要在查询中使用缓存?

Mysql ORDER BY 与复合 PK

mysql - 使用 group_concat 标记查询

php - 如何选择时间戳距10分钟的所有记录?

sql - 您可以并且应该将表名存储在表中吗?