【问题标题】: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

【问题讨论】:

    标签: sql-server optimization views query-optimization


    【解决方案1】:

    假设不是索引视图...

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

    除非重复使用,否则拥有视图不会增加任何价值。但是,您最终可以将视图连接到视图连接到视图,当展开时,会给出比预期复杂得多的计划。

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

    【讨论】:

    • 人们实际上会假设使用索引视图应该更加高效。为什么相反?
    【解决方案2】:

    人们希望在这种简单的情况下没有区别。

    当使用嵌套视图和在视图上连接的视图时,总是值得检查执行计划以确认这一点。

    这是one example 的一个案例,其中加入的 View 的计划不是最优的。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-28
          • 1970-01-01
          • 1970-01-01
          • 2020-02-07
          • 1970-01-01
          • 1970-01-01
          • 2016-01-12
          • 1970-01-01
          相关资源
          最近更新 更多