视图是仅执行所需的连接,还是始终执行所有连接?

时间:2010-04-26 19:15:08

标签: oracle view behavior

我在oracle DB上。可以说我有一个连接到三个表的视图。视图每个都有两个字段。每个字段只需要来自三个表中的两个的数据。

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

3 个答案:

答案 0 :(得分:2)

一般来说,它必须击中三个表。 考虑

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

证明

答案 1 :(得分:0)

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

答案 2 :(得分:0)

通常,数据库引擎会加入所有三个表,以确保它得到正确的答案。

Oracle有时会使用其中一个不会改变结果的表格。

如果符合以下条件,则可以这样做: -

  • 要对表进行外键约束(即表中的一行) 可以保证找到)

  • 表格未使用。即没有从where子句中选择,等等。