【发布时间】:2010-04-27 07:21:24
【问题描述】:
我在 Oracle 数据库上。可以说我有一个连接到三个表的视图。该视图各有两个字段。每个字段只需要三个表中两个表的数据。
如果我查询视图并仅返回一个字段,视图是否仍连接到三个表或仅连接到它需要计算字段的两个表?
【问题讨论】:
我在 Oracle 数据库上。可以说我有一个连接到三个表的视图。该视图各有两个字段。每个字段只需要三个表中两个表的数据。
如果我查询视图并仅返回一个字段,视图是否仍连接到三个表或仅连接到它需要计算字段的两个表?
【问题讨论】:
一般情况下它必须打三张桌子。 考虑
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
证明了这一点【讨论】:
这可能取决于所使用的连接类型。如果它们都是内连接,那么肯定需要检查所有三个表。
【讨论】:
一般来说,数据库引擎会连接所有三个表以确保得到正确的答案。
Oracle 有时会删除其中一个不会改变结果的表。
这可以在以下情况下完成:-
要删除的表存在外键约束(即表中的一行 可以保证找到)
该表未使用。即未选择,在where子句等中。
【讨论】: