我在oracle DB上。可以说我有一个连接到三个表的视图。视图每个都有两个字段。每个字段只需要来自三个表中的两个的数据。
如果我查询视图并只返回一个字段,视图是否仍然连接到三个表,或者只是连接到计算字段所需的两个表?
答案 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子句中选择,等等。