1

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

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

4

3 回答 3

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”中父行的存在。这篇文章证明了这一点

于 2010-04-26T23:21:24.030 回答
0

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

于 2010-04-26T19:15:51.917 回答
0

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

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

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

  • 被淘汰的表存在外键约束(即可以保证找到表中的一行)

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

于 2010-04-26T23:21:15.123 回答