我在甲骨文数据库上。可以说我有一个连接到三个表的视图。该视图各有两个字段。每个字段只需要来自三个表中的两个的数据。
如果我查询视图并仅返回一个字段,该视图是否仍连接到三个表或仅连接到它需要计算字段的两个表?
一般来说,它必须打三张桌子。考虑
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”中父行的存在。这篇文章证明了这一点
这可能取决于所使用的连接类型。如果它们都是内部连接,则肯定需要检查所有三个表。
一般来说,数据库引擎会连接所有三个表以确保它得到正确的答案。
Oracle 有时会删除其中一个不会改变结果的表。
这可以在以下情况下完成:-
被淘汰的表存在外键约束(即可以保证找到表中的一行)
该表未使用。即未选择,在where子句等中。