【发布时间】: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,这几乎肯定适用于这个示例。但在现实世界中,谓词推送是有局限性的。在某些时候,视图可能包含阻止谓词推送的功能。