Oracle SQL优化
1、选择最有效的表名顺序
例:
/*高效的SQL*/ SELECT * FROM LOCATION L, CATEGORY C, EMP E WHERE E.EMP_NO BETWEEN 1000 AND 2000 AND E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN /*低效的SQL*/ SELECT * FROM EMP E, LOCATION L, CATEGORY C WHERE E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN AND E.EMP_NO BETWEEN 1000 AND 2000
2、where子句中的连接顺序(最先筛选掉最多的)
因为Oracle 采用自下而上或自右向左的顺序解析WHERE子句
3、select 避免使用 *
减少多余的数据库查询开销
4、减少数据库的访问次数
减少Oracle的工作量
5、在删除数据的时候尽量使用 truncate 而非 delete
delete :Oracle 会在Rollback的时候保存删除信息用于备份恢复 truncate 则不会保存也不能恢复
6、尽量多使用commit
释放资源,可以提高程序性能
7、减少对表的查询
/*低效SQL*/ SELECT TAB_NAME FROM TABLES WHERE TAB_NAME =( SELECT TAB_NAME FROM TAB_COLUMNS WHERE VERSION = 604) AND DB_VER =( SELECT DB_VER FROM TAB_COLUMNS WHERE VERSION = 604) /*高效SQL*/ SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER)=( SELECT TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)
8、用exists 代替 in
提高查询的效率。
/*低效SQL*/ SELECT * FROM EMP WHERE EMPNO > 0 AND DEPTNO IN ( SELECT DEPTNO FROM DEPT WHERE LOC = 'MELB') /*高效SQL*/ SELECT * FROM EMP WHERE EMPNO > 0 AND EXISTS (SELECT 1 FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = 'MELB')
9、表连接替换exists 更有效率
10、使用索引
11、union 代替 or ,union all 代替 union
union all 不会排序去重
12、优化GROUP BY提高GROUP BY语句的效率,可以通过将不需要的记录在GROUP BY之前过滤掉