加入反对意见:性能问题

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 年前更聪明。

【讨论】:

以上是关于加入反对意见:性能问题的主要内容,如果未能解决你的问题,请参考以下文章

如何聘用优秀的性能测试工程师

嵌套循环性能[关闭]

加入后引发明显的性能问题

Rails:加入记录的性能问题

加入两个大表时的性能问题

恒丰银行,基于OpenStack的云性能监控