1. 程式人生 > >oracle之語句調優

oracle之語句調優

1.SQL語句大寫

因為oracle總是先解析SQL語句,把小寫的字母轉換成大寫的再執行。

2.表別名

多表join時,儘量使用表別名,同時把表別名字首於每一列上,減少解析的時間及由列歧義引起的語法錯誤

3.from從右到左解析表名

from子句中寫在最後的表(基礎表也稱為驅動表,driving table)將被最先處理,儘量記錄條數最少的表作為基礎表放最後,如維表

4.where自下向上解析

表之間的連線必須寫在其他where條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾

5.select *

儘量避免使用*查詢全部列,ORACLE在解析的過程中, 會將'*' 依次轉換成所有的列名, 這個工作是通過查詢資料字典完成的, 這意味著將耗費更多的時間。

6.避免使用耗費資源的操作:

帶有DISTINCT、UNION、MINUS、INTERSECT、ORDER BY的SQL語句會啟動SQL引擎執行耗費資源的排序(SORT)功能。DISTINCT需要一次排序操作,而其他的至少需要執行兩次排序。

7.union all和union

UNION兩個集合時,這兩個結果集合會以UNION-ALL的方式被合併,然後在輸出最終結果前進行排序。如果用UNION ALL替代UNION, 這樣排序就不是必要了。效率就會因此得到提高。注意UNION ALL將重複輸出兩個結果集合中相同記錄。

8.用EXISTS替代IN、用NOT EXISTS替代 NOT IN

在基於基礎表的查詢中經常需要對另一個表進行聯接。在這種情況下, 使用EXISTS(或NOTEXISTS)通常將提高查詢的效率。在子查詢中,NOT IN子句將執行一個內部的排序和合並。無論在哪種情況下,NOT IN都是最低效的(要對子查詢中的表執行了一個全表遍歷)。所以儘量將NOT IN改寫成外連線(Outer Joins)或NOT EXISTS。 

9.用Where子句替換HAVING子句

 避免使用HAVING子句,HAVING只會在檢索出所有記錄之後才對結果集進行過濾。這個處理需要排序,總計等操作。最好能通過WHERE子句限制記錄的數目。

10.用>=替代>

區別:前者DBMS將直接跳到第一個ID等於4的記錄而後者將首先定位到ID=3的記錄並且向前掃描到第一個ID大於3的記錄。  

11.建立索引

索引要點:

  • 索引之後,按索引欄位重複最少的來排序,會達到最優的效果。以我們的表來說,如果建立了No的聚集索引,把No放在where子句的第一位是最佳的,其次是Id,然後是MgrObjId,最後是時間,時間索引如果表是一個小時的,最好不要用
  • where子句的順序
  • 決定了查詢分析器是否使用索引來查詢。比如建立了MgrObjId和Id的索引,那麼where MgrObjId='' and Id='' and Dtime=''就會採用索引查詢,而where Dtime='' and MgrObjId='' and Id=''則不一定會採用索引查詢。
  • 把非索引列的結果列放在包含列中。因為我們條件是MgrObjId和Id以及Dtime,因此返回結果中只需包含Dtime和Value即可,因此把Dtime和Value放在包含列中,返回的索引結果就有這個值,不用再查物理表,可以達到最優的速度。