【发布时间】:2026-01-08 00:40:02
【问题描述】:
我了解视图是 Oracle 中基础表或表集的窗口。例如,如果我有一个通过连接多个表创建的视图,当我从视图中选择数据时,视图会执行实际的连接操作吗?视图是否比连接多个表以获取数据更好,还是在性能方面相同?
【问题讨论】:
-
查看执行计划以了解两者:但我相信如果应用过滤条件,视图会更慢。 (假设我们不是在谈论物化视图)我认为视图必须先物化,然后再应用限制,就像直接从表中选择一样,引擎可以优化连接并根据条件和索引过滤掉数据;视图可能无法做到。
-
感谢 xQbert,是的,我在谈论视图。我假设物化视图会使用额外的存储空间。
-
谢谢 xQbert,“首先实现”是什么意思?
-
我的意思是必须先将表连接的结果带入内存,然后再应用限制。这意味着如果引擎能够在引入结果之前优化查询,则可能会将更多的数据引入内存。因此,如果我有两个表,每个表有 10,000 行并进行交叉连接,我将获得 10,000,000 个结果集。然后需要将其限制为我实际需要的 4 条记录......但是,如果引擎首先对这些表中的每一个应用过滤器以说只从每个表中获取 2 行,我最终只需要 4 行。只需要通过 10,000 两次
-
但是视图是预编译的 SQL 语句,因此引擎在返回整个数据集时可以更快,因为它没有编译视图的开销。但是,如果引擎只是直接针对表进行处理,则引擎可能无法有效地限制数据,这可以抵消这一点。因此,在某些情况下,它会更快(从视图中选择所有数据时),或者在从视图中选择数据的小子集时可能会更慢。这就是为什么我说看看这两种方法的执行计划它是“知道”的唯一方法,它更快。