Oracle View 与 Oracle 中的联接表

Posted

技术标签:

【中文标题】Oracle View 与 Oracle 中的联接表【英文标题】:Oracle View vs joining tables in Oracle 【发布时间】:2016-03-30 16:18:09 【问题描述】:

我了解视图是 Oracle 中基础表或表集的窗口。例如,如果我有一个通过连接多个表创建的视图,当我从视图中选择数据时,视图会执行实际的连接操作吗?视图是否比连接多个表以获取数据更好,还是在性能方面相同?

【问题讨论】:

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

单个查询和使用视图的逻辑等效查询之间通常没有性能差异。

Oracle 具有可以将视图与外部查询结合起来的优化器转换;谓词推送、简单和复杂的视图合并等。将视图视为构建大型查询的文本宏,而不是返回行的函数。

例如,在下面的查询中,Oracle 可能足够聪明,可以将主键列上的谓词推送到视图中。虽然视图本身可能返回数百万行,但当整个查询运行时,Oracle 将首先在主键列上应用谓词。

select *
from view_returns_millions_of_rows
where primary_key_value = 1;

【讨论】:

以上是关于Oracle View 与 Oracle 中的联接表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 >2 个表上进行外部联接 (Oracle)

SQL Server 中的 Oracle 样式联接

Spark 中的 Oracle 表之间的联接

Oracle 完全联接中的重复项 [重复]

oracle左连接与右连接

Oracle DB 使用连接显示多个表中的数据