最基本最簡單的方式是減少訪問數據庫的次數。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( )*/ 使用指定表的指定索引
/*+ append */ 以直接加載的方式將數據加載入庫
/*+leading( )*/在多表關聯查詢中,指定哪個表作為驅動表,即告訴優化器首先要訪問哪個表上的數據。
/*+ parallel() */ 在sql中指定執行的並行度,這個值將會覆蓋自身的並行度
看Description的基數(執行結果返回的數據的行數)和自己預估的基數是否大致一直,不一致則考慮其它影響效率的情況,如統計信息比較舊等。