2011-01-05 41 views
1

如果我已经定义在SQL Server这样的观点: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 

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

谢谢

+5

视图内的ORDER BY'不起作用。有一些杂质(<2005你可以指定'TOP 100 PERCENT'),但随着优化器的改进,它变得毫无意义。如果您需要特定订单,则必须在最外面的查询中指定它。 – 2011-01-05 11:49:45

+1

使用where子句WHERE t1.f1 = 100后,使用t1.f1的顺序没有任何意义。即使结果集包含多行,那么此顺序也不做任何操作 – 2011-01-05 13:10:38

回答

5

应该没有性能损失。

简化复杂查询是什么意见。

如果性能是你所关心的 - 在SQL Server中读到indexed views

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

  • 聚合可以预先计算和存储在索引中,以尽量减少查询执行过程中昂贵的计算。
  • 可以预先加入表格并存储结果数据集。
  • 可以存储连接或聚合的组合。
0

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

如果您将视图加入到视图中,那么执行计划可以是次优的,并且包含对可能已被合并的同一个表的重复访问。还有可能会有意见和predicate pushing的问题。