温故而知新
规则1 在查询语句中不允许使用SELECT *
使用SELECT时,不允许使用SELECT *,要写出具体的列名。目的是防止数据字段增加后的影响。
规则2 使用多表连接时要使用表的别名明确的标明是哪个表中的列
使用表的别名明确的告诉oracle是哪个表上的列,这样减少了oracle的工作,提高了效率。
例如:
避免使用SELECTempno,dname
FROM emp,dept
WHERE emp.deptno=dept.deptno
建议使用SELECT e.empno,d.dname
FROM emp e,dept d
WHERE e.deptno=d.deptno
规则3 注意where字句写法,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。
(低效)
SELECT …
FROM EMP E
WHERE SAL > 2000
AND JOB = ‘MANAGER’
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
(高效)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*)FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 2000
AND JOB = ‘MANAGER’;
规则4尽量将记录少的表放在FROM字句最后面,做为基础表
尽量将记录少的表放在FROM字句的最后面,作为基础表。(ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表)将被最先处理)
例如:
表 TAB1 16,384 条记录
表 TAB2 1 条记录
选择TAB2作为基础表(最好的方法)
select count(*) from tab1,tab2 执行时间0.96秒
选择TAB1作为基础表(不佳的方法)
select count(*) from tab2,tab1 执行时间26.09秒
规则5 两个结果集若没有重复记录用union all替换union
使用UNION的两个结果集中没有重复的记录,尽量使用UNION ALL替换UNION。因为UNION将对结果集中记录进行排序操作。