Oracle 提高查詢性能(基礎)
#1,選擇最有效的表名順序
Oracle解析器總是按照從右至左的順序處理FROM后面的表,因此FROM最右邊的表將會被當做驅動表優先處理,當存在多個表關聯時,應當使用記錄少的表當做驅動表。如果關聯的表多的話,則用交叉表作為驅動表。
#2,select中避免使用'*'.
#3, 減少數據庫訪問的次數
-
每當執行一條SQL語句,Oracle 需要完成大量的內部操作,象解析SQL語句,估算索引的利用率,綁定變量, 讀數據塊等等.由此可
-
見,減少訪問數據庫的次數,實際上是降低了數據庫系統開銷
#4, 用Where子句替換HAVING
-
-->盡可能的避免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,但是不顯示查詢輸出