1、 查兩張以上表時,把記錄少的放在右邊
2、 WHERE子句中的連接順序
ORACLE采用自上而下的順序解析WHERE子句,根據這個原則,那些可以過濾掉最大數量記錄的條件應寫在WHERE子句最后。
例如:查詢員工的編號,姓名,工資,部門名
如果emp.sal>1500能過濾掉半數記錄的話,
selectemp.empno,emp.ename,emp.sal,dept.dname
from emp,dept
where (emp.deptno =dept.deptno) and (emp.sal > 1500)
3、 SELECT子句中避免使用*號
ORACLE在解析的過程中,會將*依次轉換成所有的列名,這個工作是通過查詢數據字典完成的,這意味着將耗費更多的時間
4、 避免對大表進行無條件或無索引的的掃描
5、 清空表時用TRUNCATE替代DELETE
6、 盡量多使用COMMIT;因為COMMIT會釋放回滾點
7、 用索引提高查詢效率,善用索引
避免在索引列上使用NOT;因為Oracle服務器遇到NOT后,他就會停止目前的工作,轉而執行全表掃描。
避免在索引列上使用計算;WHERE子句中,如果索引列是函數的一部分,優化器將不使用索引而使用全表掃描,這樣會變得慢
例如,SAL列上有索引,
低效:
SELECT EMPNO,ENAME
FROM EMP
WHERE SAL*12 > 24000;
高效:
SELECT EMPNO,ENAME
FROM EMP
WHERE SAL > 24000/12;
8、字符串型,能用=號,不用like;=號表示精確比較,like表示模糊比較
9、 用 >= 替代 >
低效:
SELECT * FROM EMPWHERE DEPTNO > 3
首先定位到DEPTNO=3的記錄並且掃描到第一個DEPT大於3的記錄
高效:
SELECT * FROM EMPWHERE DEPTNO >= 4
直接跳到第一個DEPT等於4的記錄
10、 用IN替代OR
select * from emp where sal =1500 or sal = 3000 or sal = 800;
select * from emp where sal in (1500,3000,800);
11、 用exists代替in;not exists代替 notin
not in字句將執行一個內部的排序和合並,任何情況下,not in是最低效的,子查詢中全表掃描;表連接比exists更高效
12、 用UNION-ALL 替換UNION
當SQL語句需要UNION兩個查詢結果集合時,這兩個結果集合會以UNION-ALL的方式被合並, 然后在輸出最終結果前進行排序. 如果用UNION ALL替代UNION,這樣排序就不是必要了. 效率會因此得到提高。
13、 避免使用耗費資源的操作
帶有DISTINCT,UNION,MINUS,INTERSECT的SQL語句會啟動SQL引擎 執行耗費資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序. 通常,帶有UNION, MINUS , INTERSECT的SQL語句都可以用其他方式重寫。
最后:同樣的操作有些時候可以在程序上處理的就程序上處理,畢竟在內存中的執行速度比在硬盤上執行要高非常多。