標籤:file column cbo 具體步驟 包括 使用者名稱 系統 寫法 商務邏輯
Oracle資料庫裡SQL最佳化的終極目標就是要縮短目標SQL語句的執行時間。要達到上述目的,我們通常只有如下三種方法可以選擇:
1、降低目標SQL語句的資源消耗。
2、並存執行目標SQL語句。
3、平衡系統的資源消耗。
方法1:a、在不更改商務邏輯的情況下改寫SQL來降低目標SQL語句的資源消耗。
b、不改寫SQL但通過調整執行計畫或相關表的資料來降低目標SQL語句的資源消耗。
注意:走索引不一定比全表掃描好,例如在很多情況下走索引的嵌套迴圈串連的執行效率往往比不上走全表掃描的雜湊串連的執行效率。
方法2:實際上是以額外的資源消耗來換取執行時間的縮短,很多情況下使用並行是針對某些SQL的唯一最佳化手段。
方法3:可以避免不必要的資源爭用所導致的目標SQL語句執行時間的增長。由於在目標SQL執行時系統處於高負荷狀態,執行目標SQL所需的
硬體資源(CPU、記憶體、I/O等)得不到保障,存在爭用的情況。在這種情況下,我們可以把一些與目標SQL同時執行的不重要但很消耗系統資源
的操作(如報表、批處理等)挪到系統不忙的時候執行。
Oracle資料庫裡做SQL最佳化的具體步驟:
1、找到執行時間最長、消耗系統資源最多的Top SQL語句。
2、查看上述Top SQL語句的執行計畫,並結合器資源消耗情況和相關統計資訊、trace檔案來分析其執行計畫是否合理。
3、通過修正措施(如:調整上述Top SQL的執行計畫等)來對上述Top SQL做調整以縮短它們的執行時間,這裡調整的指導原則就是前面介紹的
三種方法。
針對Top SQL的常用調整手段:
1、如果是統計資訊不準或是因為CBO計算某些SQL的成本所用公式的先天不足而導致的SQL效能問題,我們可以通過重新收集統計資訊,或者手工
修改統計資訊,或者使用Hint來加以解決。
注釋:對錶收集統計資訊的方式 exec dbms_stats.gather_table_stats(ownname=>‘資料庫使用者名稱‘,tabname=>‘表名‘,method_opt=>‘for all
columns size 1‘,CASCADE=>true,estimate_percent=100);
2、如果是SQL語句的寫法問題,我們可以通過在不更改商務邏輯的情況下改寫SQL來解決問題。
3、如果是不必要的全表掃描/排序而導致的目標SQL的效能問題,我們可以通過建立合適的索引(包括函數索引、位元影像索引等)來加以解決。
4、如果是因為各種原因導致目標SQL的執行計畫不穩定,我們可以通過使用Hint、SQL Profile或者SPM來解決問題。
5、如果是表或者索引的不良設計導致的目標SQL的效能問題,我們可以通過重新設計表/索引,重新組織表裡的資料來解決問題。
6、如果上述調整措施都失效,我們可以考慮用並行來縮短目標SQL的執行時間。
7、如果上述調整措施(包括並行)都失效,我們還可以再聯絡實際業務的基礎上更改目標SQL的執行邏輯,甚至不執行目標SQL,這是最徹底的
最佳化了。
對oracle中SQL最佳化的理解