Oracle資料庫查詢效能最佳化問題
查詢、新增、修改及刪除資料庫等操作是影響web應用程式效能指標的重大因素。下面一些常見的建議可以提高查詢效能問題。
1. 最佳化JDBC串連
採用資料庫連接池機制可以將曾開啟的資料庫連接儲存在緩衝中,這樣程式其他部分就可以繼續利用,從而節省了資料庫連接耗費的時間。
2. 提高select子句的查詢速度
(1)建立索引
若經常要通過表中的某一欄位來查詢資料,就可以將這個欄位設定為表的一個索引。在select查詢中如果發現查詢的列是一個索引列,則資料庫會從索引表中掃描資料,不再需要從整個資料表中掃描,效能會極大的提高。
(2)在select子句中避免使用“*”
資料庫在解析的過程中, 會將“*” 依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的, 這意味著將耗費更多的時間。最好可以把列名一一寫出。
3. 避免使用耗費資源的操作
帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啟動SQL引擎執行耗費資源的排序(SORT)功能。 DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序。GROUP BY會觸發嵌入排序(NESTED SORT) ; 執行UNION時, 唯一排序(SORT UNIQUE)操作被執行,而且它晚於嵌入排序。 嵌入的排序的深度會大大影響查詢的效率。
4. 最佳化where子句來提高查詢速度
(1)SQL語句用大寫:因為Oracle總是先解析sql語句,把小寫字母轉換成大寫的再執行。
(2)WHERE子句中的串連順序:ORACLE採用自下而上(從右至左)的順序解析WHERE子句,根據這個原理,表之間的串連必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾。
(3)用Where子句替換HAVING子句: 避免使用HAVING子句, HAVING 只會在檢索出所有記錄之後才對結果集進行過濾. 這個處理需要排序,總計等操作. 如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷.
(4)當查詢多個表時,使用表的別名:可以減少解析的時間並減少那些由Column歧義引起的語法錯誤。
(5)用EXISTS替代IN、用NOT EXISTS替代NOT IN、用EXISTS替換DISTINCT: 在子查詢中,NOT IN子句將執行一個內部的排序和合并. 無論在哪種情況下,NOT IN都是最低效的 (因為它對子查詢中的表執行了一個全表遍曆). 為了避免使用NOT IN ,我們可以把它改寫成外串連(Outer Joins)或NOT EXISTS。EXISTS 使查詢更為迅速,因為RDBMS核心模組將在子查詢的條件一旦滿足後,立刻返回結果。
(6)最佳化GROUP BY:為提高group by語句的效率,可在其之前先過濾不需要的記錄。
(7)高效使用where子句:某些where子句不使用索引,可以替換(索引只會告訴表中內容,不能告訴表中不存在的),如用a>0 and a<0替換a!=0、a<>0,用in代替or.