【问题标题】:SQL Server Views performancesSQL Server 查看性能
【发布时间】:2011-01-05 11:37:12
【问题描述】:

如果我在 SQL Server 中定义了这样的视图:

CREATE View V1 
AS
SELECT *    
FROM t1
INNER JOIN t2 ON t1.f1 = t2.f2    
ORDER BY t1.f1

我应该期望两者之间的性能差异

SELECT * FROM V1 WHERE V1.f1 = 100

只是避开视线,像这样

SELECT *    
FROM t1
INNER JOIN t2 ON t1.f1 = t2.f2    
WHERE t1.f1 = 100
ORDER BY t1.f1

?

除了需要集中复杂查询之外,我们没有任何理由使用视图。

谢谢

【问题讨论】:

  • ORDER BY 在视图中不起作用。有一些问题(TOP 100 PERCENT),但是随着优化器的改进,它变得毫无意义。如果您需要特定的订单,则必须在最外层的查询中指定它。
  • 在使用 where 子句 WHERE t1.f1 = 100 后使用 order by t1.f1 没有任何意义。即使结果集包含多行,此 order by 也无济于事

标签: sql-server performance views


【解决方案1】:

应该没有性能损失。

简化复杂的查询是视图的用途。

如果您关心性能问题 - 请阅读 SQL Server 中的 indexed views

索引视图提供了使用标准索引无法实现的额外性能优势。索引视图可以通过以下方式提高查询性能:

  • 可以预先计算聚合并将其存储在索引中,以最大限度地减少查询执行期间昂贵的计算。
  • 可以预先加入表并存储生成的数据集。
  • 可以存储连接或聚合的组合。

【讨论】:

    【解决方案2】:

    通常,您不应期望性能差异,但请检查查询的执行计划。

    如果您将视图加入视图,则执行计划可能不是最优的,并且包含对可能已合并的同一个表的重复访问。视图和predicate pushing 也可能存在问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多