直接从表中选择并从视图中进行选择会产生相同的性能影响

时间:2014-09-03 12:00:20

标签: sql oracle view

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

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引擎首先必须从连接表中选择所有行,然后再次应用第二个查询来过滤它。我错了吗?

2 个答案:

答案 0 :(得分:2)

如果您使用的是Toad,您可以简单地查看解释计划,看看是否存在差异。 我不认为会有,因为你假设它执行View而不是执行其他where子句是错误的。 Oracle(我认为每个其他数据库)都会接受整个事情,分析执行它的最佳方式,而不仅仅是执行它。这是使用SQL的重点。 告诉Oracle应该执行哪些步骤的唯一方法是使用提示。

答案 1 :(得分:1)

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