【问题标题】:Do views only perform the joins that they need to, or all joins always?视图只执行它们需要的连接,还是总是执行所有连接?
【发布时间】:2010-04-27 07:21:24
【问题描述】:

我在 Oracle 数据库上。可以说我有一个连接到三个表的视图。该视图各有两个字段。每个字段只需要三个表中两个表的数据。

如果我查询视图并仅返回一个字段,视图是否仍连接到三个表或仅连接到它需要计算字段的两个表?

【问题讨论】:

    标签: oracle view behavior


    【解决方案1】:

    一般情况下它必须打三张桌子。 考虑

    SELECT A.VAL, B.VAL, C.VAL FROM A JOIN B ON A.ID = B.ID JOIN C ON A.ID = C.ID
    

    “A”中的单个 ID 在 B 或 C 中可能有零个、1 个或多个匹配项。如果表“C”为空,则视图将永远不会返回一行,因此即使只是查询 A。 VAL或B.VAL,还是要看看“C”中是否有对应的行。

    例外情况是,由于强制引用完整性约束,优化器知道“B”中的行将始终在“A”中具有父行。在这种情况下,选择 B.VAL 不需要实际检查“A”中父行的存在。 article

    证明了这一点

    【讨论】:

    • 感谢文章参考!
    【解决方案2】:

    这可能取决于所使用的连接类型。如果它们都是内连接,那么肯定需要检查所有三个表。

    【讨论】:

      【解决方案3】:

      一般来说,数据库引擎会连接所有三个表以确保得到正确的答案。

      Oracle 有时会删除其中一个不会改变结果的表。

      这可以在以下情况下完成:-

      • 要删除的表存在外键约束(即表中的一行 可以保证找到)

      • 该表未使用。即未选择,在where子句等中。

      【讨论】:

        猜你喜欢
        • 2022-07-30
        • 1970-01-01
        • 2013-09-20
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多