#1,選擇最有效的表名順序數據庫
Oracle解析器老是按照從右至左的順序處理FROM後面的表,所以FROM最右邊的表將會被當作驅動表優先處理,當存在多個表關聯時,應當使用記錄少的表當作驅動表。若是關聯的表多的話,則用交叉表做爲驅動表。優化
#2,select中避免使用'*'.排序
#3, 減小數據庫訪問的次數索引
每當執行一條SQL語句,Oracle 須要完成大量的內部操做,象解析SQL語句,估算索引的利用率,綁定變量, 讀數據塊等等.由此可 效率
見,減小訪問數據庫的次數,其實是下降了數據庫系統開銷
變量
#4, 用Where子句替換HAVINGselect
-->儘量的避免having子句,由於HAVING 子句是對檢索出全部記錄以後再對結果集進行過濾。這個處理須要排序,總計等操做 統計
-->經過WHERE子句則在分組以前便可過濾沒必要要的記錄數目,從而減小聚合的開銷 。數據
#5,使用 UNION ALL 替換 UNION(若是有可能的話) 查詢
當SQL語句須要UNION兩個查詢結果集時,這兩個結果集合會以UNION-ALL的方式被合併, 而後在輸出最終結果前進行排序。
若是用UNION ALL替代UNION, 這樣排序就不是必要了。 效率就會所以獲得提升。
UNION ALL會輸出全部的結果集,而UNION則過濾掉重複記錄並對其進行排序.所以在使用時應考慮業務邏輯是否容許當前的結果集存在重複現象
#6, 有兩個簡單例子,以說明 「exists」和「in」的效率問題
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
T1數據量小而T2數據量很是大時,T1<<T2 時,1) 的查詢效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
T1數據量很是大而T2數據量小時,T1>>T2 時,2) 的查詢效率高。
經過使用EXISTS,Oracle會首先檢查主查詢,而後運行子查詢直到它找到第一個匹配項,這就節省了時間。Oracle在執行IN子查詢時,首先執 行子查詢,並將得到的結果列表存放在一個加了索引的臨時表中。在執行子查詢以前,系統先將主查詢掛起,待子查詢執行完畢,存放在臨時表中之後再執行主查 詢。這也就是使用EXISTS比使用IN一般查詢速度快的緣由。
#7, AUTOTRACE
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 報告,這是缺省模式SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只顯示優化器執行路徑報告 SET AUTOTRACE ON STATISTICS -- 只顯示執行統計信息SET AUTOTRACE ON ----------------- 包含執行計劃和統計信息 SET AUTOTRACE TRACEONLY ------ 同set autotrace on,可是不顯示查詢輸出