直接从表中选择和从视图中选择是不是具有相同的性能影响

Posted

技术标签:

【中文标题】直接从表中选择和从视图中选择是不是具有相同的性能影响【英文标题】:Do selecting directly from table and selecting from view have the same performance impact直接从表中选择和从视图中选择是否具有相同的性能影响 【发布时间】:2014-09-03 12:00:20 【问题描述】:

假设我有以下表格和视图;

CREATE TABLE EMPLOYEES
(
 EMPID NUMBER(3,0),
 LAST_NAME VARCHAR2(20),
 FIRST_NAME VARCHAR2(20),
 DEPARTMENTID NUMBER(2,0)

);

CREATE TABLE DEPARTMENTS
(
  DEPARTMENTID NUMBER(2,0),
  DEPNAME VARCHAR2(50),
);

CREATE VIEW EMD_DEP AS
SELECT EMP.EMPID,EMP.LAST_NAME,EMP.FIRST_NAME,DEP.DEPNAME FROM EMPLOYEES EMP NATURAL JOIN
       DEPARTMENTS DEP;

下面这两个查询在性能方面是否相同? :

1. SELECT * FROM EMP_DEP WHERE LAST_NAME LIKE 'A%';
2. SELECT EMP.EMPID,EMP.LAST_NAME,EMP.FIRST_NAME,DEP.DEPNAME FROM EMPLOYEES EMP NATURAL JOIN
          DEPARTMENTS DEP
          WHERE EMP.LAST_NAME LIKE 'A%';

我进行了测试,两个查询都在 0.016 秒内执行。但我认为从视图中选择一定要慢一些,因为(我认为)SQL 引擎首先必须从连接表中选择所有行,然后再次应用第二个查询来过滤它。我错了吗?

【问题讨论】:

它不应该有所不同,因为视图是一个存储查询 可能存在差异,但对于这样一个简单的查询,您不会看到它们。您对 Oracle 中视图如何工作的理解不正确。 这是否意味着如果查询复杂得多,差异会非常明显? 这是一个很难回答的问题。在理想情况下,Oracle 可以使用优化器转换来重写两个逻辑上相同的查询以使用相同的执行计划。特别是在这种情况下,它将使用 predicate push,这几乎肯定适用于这个示例。但在现实世界中,谓词推送是有局限性的。在某些时候,视图可能包含阻止谓词推送的功能。 【参考方案1】:

如果您使用 Toad,您可以简单地查看解释计划,看看是否有区别。 我认为不会,因为您假设它执行 View 而不是执行另一个 where 子句是错误的。 甲骨文(我认为所有其他数据库)都接受了整个事情,分析了执行它的最佳方法,而不仅仅是执行它。这就是使用 SQL 的全部意义所在。 告诉 Oracle 执行步骤的顺序的唯一方法是使用提示。

【讨论】:

我实际上已经查看了解释计划,发现两者是相同的。但我不确定这是否永远是真的。 除非您使用大量提示,否则您永远无法真正确定,oracle 对您的语句做了什么,但我从未听说过,视图会有任何性能劣势,我做了一些大数据操作意见。【参考方案2】:

您不会看到任何差异,因为查询太小,这是您使用 oracle 已经解析和分析过此查询的视图时的好处之一。如果您有一个大查询,Oracle 必须花一些时间来解析和分析它。阅读Oracle Contents 很有帮助。

【讨论】:

以上是关于直接从表中选择和从视图中选择是不是具有相同的性能影响的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值

从表中选择具有最大日期的行

用于从表中选择具有最新时间戳的行的 JOOQ 代码

SQL Server CE性能,从表中选择7000条记录需要8s

从表中选择 WHERE 子句中具有不同 IN 列表的表

从表中的两列中选择相同的数据,并使用一条sql语句显示所有数据