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之前过滤掉

posted @ 2022-08-25 15:31  尘尘尘尘  阅读(420)  评论(0编辑  收藏  举报