加入观点:性能问题

时间:2010-09-07 11:06:12

标签: sql-server optimization views query-optimization

从性能的角度来看,这样做是这样的:

select * from MYTABLEONE MT1
join MYVIEW MV on MT1.ID = MV.ID

( 视图在哪里

create view MYVIEW as
select MT2.*, MT3.*
from MYTABLETWO MT2
join MYTABLETHREE MT3 on MT2.OtherID = MT3.OtherID

或者这样做更好:

select MT1.*, MT2.*, MT3.*
from MYTABLEONE MT1
join MYTABLETWO MT2 on MT1.ID = MT2.ID
join MYTABLETHREE MT3 on MT2.OtherID = MT3.OtherID

4 个答案:

答案 0 :(得分:4)

假设没有索引视图......

视图将像宏一样展开,并且应该生成相同的计划。

除非重复使用,否则视图不会添加任何值。但是,您最终可以使用视图加入来查看加入视图,当扩展时,它会提供比预期更复杂的计划。

恕我直言,除非你知道自己在做什么,否则不要使用视图。

答案 1 :(得分:3)

人们希望这种直截了当的情况没有区别。

使用View上加入的嵌套视图和视图时,尽管总是值得检查执行计划以确认这一点。

这是联合视图的计划不是最优的情况的one example

视图中的predicate pushing也可能存在问题

答案 2 :(得分:0)

除非MYVIEW是一个索引视图,否则在性能方面没有任何损失或收益。

此外,通过查看实际执行计划中的“估计子树成本”,可以轻松比较两个选择。

答案 3 :(得分:0)

应该是一样的。请大家开始相信DBMS比25年前更聪明。