假设我有以下表格和视图;
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引擎首先必须从连接表中选择所有行,然后再次应用第二个查询来过滤它。我错了吗?
答案 0 :(得分:2)
如果您使用的是Toad,您可以简单地查看解释计划,看看是否存在差异。 我不认为会有,因为你假设它执行View而不是执行其他where子句是错误的。 Oracle(我认为每个其他数据库)都会接受整个事情,分析执行它的最佳方式,而不仅仅是执行它。这是使用SQL的重点。 告诉Oracle应该执行哪些步骤的唯一方法是使用提示。
答案 1 :(得分:1)
您不会看到任何差异,因为查询太小,当您使用oracle已解析并已分析此查询的视图时,您获得的好处之一。如果您有一个大问题,Oracle必须花一些时间来解析和分析它。阅读Oracle Contents这非常有帮助。