ORACLE采取自下而上的顺序解析WHERE子句,依据这个原理,表其间的联接务须写在其余WHERE条件事前, 那些可以过滤掉最大数量记要的条件务须写在WHERE子句的末了. 比......
ORACLE采取自下而上的顺序解析WHERE子句,依据这个原理,表其间的联接务须写在其余WHERE条件事前, 那些可以过滤掉最大数量记要的条件务须写在WHERE子句的末了.
比如:
(低效,执行时间156.3秒)
SELECT …
FROM EMP E
WHERE SAL >; 50000
AND JOB = ‘MANAGER’
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
(高效率,执行时间10.6秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL >; 50000
AND JOB = ‘MANAGER’;
着重点关切三:SELECT子句中避免运用 ‘ * ‘ .着重点关切
当你想在SELECT子句中列出全部的COLUMN时,施用动态SQL列摘引 ‘*’ 是一个便利的步骤.不幸的是,这是一个十分低效的步骤. 实质上,ORACLE在解析的过程中, 会将’*’ 顺次转换成全部的列名, 这个工作是透过查询数据字典完成的, 这象征将消耗更多的时间.
7. 减小访问数据库的次数
应施行每条SQL话语时, ORACLE在内部实施了许多工作: 解析SQL话语, 预算目录的利用率, 绑定变量 , 读数据块之类. 有鉴于此, 减小访问数据库的次数 , 就能事实上减小ORACLE的工作量.
比如,
以次有三种步骤可以检索出雇员号即是0342或0291的员工.
步骤一 (最低效)
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 342;
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 291;
步骤二 (次低效)
DECLARE
CURSOR C一 (E_NO NUMBER) IS
SELECT EMP_NAME,SALARY,GRADE
FROM EMP
WHERE EMP_NO = E_NO;
BEGIN
OPEN C一(342);
FETCH C一 INTO …,..,.. ;
OPEN C一(291);
FETCH C一 INTO …,..,.. ;
CLOSE C一;
END;
本文来源: 我的异常网 Java Exception Dotnet Exception Oracle Exception
步骤三 (高效率)
SELECT A.EMP_NAME , A.SALARY , A.GRADE,
1/2 1 2 下一页 尾页 |