从性能的角度来看,这样做是这样的:
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
答案 0 :(得分:4)
假设没有索引视图......
视图将像宏一样展开,并且应该生成相同的计划。
除非重复使用,否则视图不会添加任何值。但是,您最终可以使用视图加入来查看加入视图,当扩展时,它会提供比预期更复杂的计划。
恕我直言,除非你知道自己在做什么,否则不要使用视图。
答案 1 :(得分:3)
人们希望这种直截了当的情况没有区别。
使用View上加入的嵌套视图和视图时,尽管总是值得检查执行计划以确认这一点。
这是联合视图的计划不是最优的情况的one example。
视图中的predicate pushing也可能存在问题
答案 2 :(得分:0)
除非MYVIEW是一个索引视图,否则在性能方面没有任何损失或收益。
此外,通过查看实际执行计划中的“估计子树成本”,可以轻松比较两个选择。
答案 3 :(得分:0)
应该是一样的。请大家开始相信DBMS比25年前更聪明。