加入反对意见:性能问题
Posted
技术标签:
【中文标题】加入反对意见:性能问题【英文标题】:Joins against views: performance issues 【发布时间】:2010-09-07 11:06:12 【问题描述】:从性能的角度来看,这样做是否一样:
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
【问题讨论】:
【参考方案1】:假设不是索引视图...
视图将像宏一样展开,并且应该生成相同的计划。
除非重复使用,否则拥有视图不会增加任何价值。但是,您最终可以将视图连接到视图连接到视图,当展开时,会给出比预期复杂得多的计划。
恕我直言,除非您知道自己在做什么,否则不要使用视图。
【讨论】:
人们实际上会假设使用索引视图应该更加高效。为什么相反?【参考方案2】:人们希望在这种简单的情况下没有区别。
当使用嵌套视图和在视图上连接的视图时,总是值得检查执行计划以确认这一点。
这是one example 的一个案例,其中加入的 View 的计划不是最优的。
视图中的predicate pushing 也可能存在问题
【讨论】:
【参考方案3】:除非 MYVIEW 是索引视图,否则在性能方面没有损失或收益。
此外,通过查看实际执行计划中的“估计子树成本”很容易比较两个选择。
【讨论】:
【参考方案4】:应该是一样的。请大家开始相信 DBMS 会比 25 年前更聪明。
【讨论】:
以上是关于加入反对意见:性能问题的主要内容,如果未能解决你的问题,请参考以下文章