最基本最簡單的方式是減少訪問資料庫的次數。oracle在內部執行了許多任務作,比如解析sql語句, 估算索引的利用率, 讀資料塊等等,都將大量耗費oracle資料庫的執行。
選擇最有效率的表名順序,也將明顯提公升oracle的效能。 oracle解析器是按照從右到左的順序處理from子句中的表名。
在執行select子句時盡量避免使用 「*」,因為oracle在解析的過程中,會將「*」 依次轉換成列名, 這是通過查詢資料字典完成的, 這將耗費更長的時間。
可以好好利用decode函式,該函式可以避免重複掃瞄相同記錄,或者重複連線相同的表。
可以在sql*plus和sql*forms以及pro*c中重新設定arraysize引數。如此可以明顯增加每次資料庫訪問時的檢索資料量 。這裡的建議值為200。
盡量用truncate語句替代delete語句。當執行truncate命令時, 回滾段不會存放任何可被恢復的資訊,所有資料不能被恢復。因此很少資源被呼叫,整個執行時間就會很短。
在使用oracle時,盡量多使用commit命令。 該命令可以明顯釋放執行資源,因此程式的效能得到明顯提高。
可以通過用索引提高效率。oracle使用了樹形的資料結構。通過合理的索引,資料查詢時明顯快於全表掃瞄,因此可以顯著提高檢索資料的效率。
將瓶頸sql塊單獨取出,檢視其執行計畫,
首先檢查其中使用了全表掃瞄的物件,判斷其是否合適。引發錯誤使用的情形通常是:
1) 沒有建立合適的索引列導致全表掃瞄
2) 非函式索引列使用了函式引發全表掃瞄
3) 物件統計資訊過舊或未收集導致全表掃瞄、
4) 對於位圖索引,直方圖資訊的缺失有時也會導致錯誤的全表掃瞄
然後檢查其中無用的表,確認無用的表可以直接去掉減少訪問步驟減小系統開銷。
接著檢查其中是否有重複訪問的表,檢視是否可以減少訪問次數一般可以通過使用with或者建立中間表來優化。
優化訪問路徑,資料庫優化器也有不那麼聰明的時候,有時候它生成的訪問路徑可能並不是最優的,可嘗試使用hint來改變訪問路徑進行優化
常用hint:
/*+full( )*/表明對錶選擇全域性掃瞄的方法.
/*+use_nl( )*/在多表關聯查詢中,指定使用nest loops方式進行多表關聯。
/*+use_hast( )*/在多表關聯查詢中,指定使用hash join方式進行多表關聯。
/*+index( )*/ 使用指定表的指定索引
/*+leading( )*/在多表關聯查詢中,指定哪個表作為驅動表,即告訴優化器首先要訪問哪個表上的資料。
/*+ parallel() */ 在sql中指定執行的並行度,這個值將會覆蓋自身的並行度
看description的基數(執行結果返回的資料的行數)和自己預估的基數是否大致一直,不一致則考慮其它影響效率的情況,如統計資訊比較舊等。
oracle 的幾種sql優化2
對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引 前提 表資料很多 索引失效情況 1 避免在索引列上使用計算。where子句中,如果索引列是函式的一部分。優化器將不使用索引而使用全表掃瞄。低效 select from employee where...
PL SQL中oracle的sql優化
之前看了好多oracle的sql優化問題,發現好多說法不一致,後來看了下時間,有的都是好多年前的了.所以,勸大家在 眾裡尋他千 查東西的時候,一定要多看幾條,而且要注意看日期.當然,我說的也不一定對,僅供參考 1.建立索引和分割槽 2.針對oracle中 count count 列 count 1 ...
優化SQL的幾種方式
優化的目的 1 盡量保證索引能正確使用。2 盡量避免全域性搜尋。3 索引不是越多越好。方式 1 對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引 2 應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全...