1、SQL语句尽量用大写的;
因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。
2、WHERE子句中的连接顺序:
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他
WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
3、SELECT子句中避免使用 * :
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字
典完成的, 这意味着将耗费更多的时间。
4、减少访问数据库的次数(使用游标等等):
ORACLE在内部执行了许多工作: 解析SQL语句,估算索引的利用率,绑定变量,读数据块等。
5、避免使用耗费资源的操作:
带有DISTINCT、UNION、MINUS、INTERSECT、ORDER BY的SQL语句会启动SQL引擎执行
耗费资源的排序(SORT)功能。DISTINCT需要一次排序操作,而其他的至少需要执行两次排序。
通常,带有UNION、MINUS、INTERSECT的SQL语句都可以用其他方式重写。
如果数据库的SORT_AREA_SIZE调配得好,使用UNION,MINUS,INTERSECT也是可以考虑。
6、优化GROUP BY:
提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY之前过滤掉。
下面两个查询返回相同结果但明显第二个效率更高。
低效:
SELECT JOB,AVG(AGE) FROM TEMP
GROUP BY JOB HAVING JOB = 'STUDENT' OR JOB = 'MANAGER';
高效:
SELECT JOB,AVG(AGE) FROM EMP
WHERE JOB = 'STUDENT' OR JOB = 'MANAGER' GROUP BY JOB;
7、用>=替代>:
高效:
SELECT * FROM TEMP WHERE ID >=4;
低效:
SELECT * FROM TEMP WHERE ID >3;
原因:前者DBMS将直接跳到第一个ID等于4的记录而后者将首先定位到ID=3的记录并且向前扫描到第一个ID大于3的记录。
8、避免在索引列上使用计算:
低效:
SELECT … FROM TEMP WHERE SAL * 12 > 25000;
高效:
SELECT … FROM TEMP WHERE SAL > 25000/12;