數據庫查詢性能優化問題

        查詢、新增、修改及刪除數據庫等操作是影響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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章