1. 注意where子句的连接顺序。
由于oracle是自下而上解析where子句,因此对于能过虑掉最多数据的条件应该放在最后面
2. 避免使用*
虽然使用*能比较方便的查询更多的列,但是oracle需要去解析这些列,通过查询数据字典;
3 使用exists 代替 in
Where exists (select ‘x’ form a ,b where a.eno=b.eon and a.name=’loc’)
子查询以‘select 'X'开始。运用EXISTS 子句不管子查询从表中抽取什么数
据它只查看where 子句。这样优化器就不必遍历整个表而仅根据索引就可完成工作(这里假定在where 语句中使用的列存在索引)。
通常对于exists是首先检查主查询,然后去执行子查询直到匹配到条件的项为止,而如果使用in,则会去执行子查询,将子查询放到临时表,并建立索引。然后再去执行主查询。在这个过程中会将主查询挂起。因此比较耗时。
5使用decode函数来减少时间处理,以及扫描相同的表或记录
如SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0020
AND ENAME LIKE ‘SMITH%’;
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0030
AND ENAME LIKE ‘SMITH%’;
select count(decode(dept_no,0020,’X’,NULL))countdepnt_0020 ,sum(dept_no,0020,sal,NULL) sum0020_sal,count(dept_no,0030,’X’,NULL)countdeptnt_0030,sum(dept_no,0030,sal,NULL)
from emp where ename like ‘SMITH%’
4用truncate代替delete
使用delete时,其回滚段存有用来被恢复的信息,如果没有commit的话则可以进行还原,但如果直接使用truncate的话则不会有回滚段信息,直接进行提交,减了资源的占用
5多使用commit
使用commit能减少资源的占用
6用where 子句替换having子句
由于having子句在检索出所有行后再进行过虑,此过程中有排序,计算等操作比较消耗性能,但如果能用where子句减少条数据的话,则会减少相应的开销.
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
GROUP BY REGION
HAVING REGION REGION !=‘SYDNEY’
AND REGION != ‘PERTH’
SELECT REGION,AVG(LOG_SIZE)
FROM LOCATION
Where REGION REGION !=‘SYDNEY’
AND REGION != ‘PERTH’
Group by REGION
7使用表的别名
在使用多表连接查询时,使用表的别名,在查询列前面加上别名,这样能加快解析,并能避免相同的列产生的岐义。