資料庫之Oracle優化技巧(一) 1.where子句中的連接順序 在Oracle資料庫中,where子句的執行順序是自下而上進行解析,根據這個原理,表之間的連接必須寫在其他where條件之前,那些可以過濾掉最大數量記錄的條件必 須寫在where子句的末尾。 2.select子句中避免使用 ‘ * ...
資料庫之Oracle優化技巧(一)
1.where子句中的連接順序
在Oracle資料庫中,where子句的執行順序是自下而上進行解析,根據這個原理,表之間的連接必須寫在其他where條件之前,那些可以過濾掉最大數量記錄的條件必
須寫在where子句的末尾。
2.select子句中避免使用 ‘ * ‘(開發中禁止使用*)
oracle在解析的過程中,會將'*' 依次轉換成所有的列名,這個工作是通過查詢數據字典完成的,這意味著將耗費更多的時間。
3.用truncate替代delete
當刪除表中的記錄時,在通常情況下,回滾段(rollback segments )用來存放可以被恢復的信息。
如果你沒有commit事務,oracle會將數據恢復到刪除之前的狀態(準確地說是恢復到執行刪除命令之前的狀況)而當運用truncate時,回滾段不再存放任何可被恢復的信
息。當命令運行後,數據不能被恢復。因此很少的資源被調用,執行時間也會很短。
註意:儘管truncate效率比delect高,但是由於truncate刪除的數據不可恢復,所以在實際開發中還是不建議使用的
4.用 where子句替換having子句
避免使用 having子句, having只會在檢索出所有記錄之後才對結果集進行過濾. 這個處理需要排序,總計等操作.
如果能通過 where子句限制記錄的數目,那就能減 少這方面的開銷.
on、where、having 這三個都可以加條件的子句中, on 是最先執行,where 次之,having 最後,因為 on 是先把不符合條件的記錄過濾後 才進行統計,它就可以減
少中間運算要處理的數據,按理說應該速度是最快的,where 也應該比 having 快點的,因為它過濾數據後才進行 sum,在兩個表聯接時才用 on 的。
在這單表查詢統計的情 況下,如果要過濾的條件沒有涉及到要計算欄位,那它們的結果是一樣的,只是 where 可以使用 rushmore 技術,而 having 就不能,在速度
上後者要慢。
如果要涉及到 計算的欄位,就表示在沒計算之前,這個欄位的值是不確定的,where 的作用時間是在計算之前就完成的,而 having 就是在計算後才起作用 的,所以
在這種情況下,兩者的結果會不同。在多表聯接查詢時,on 比 where 更早 起作用。
5.減少對錶的查詢
from 後面的主表在執行過程中為全表掃描,在所有表訪問形式中全表掃描最耗費時間,所以在滿足業務邏輯的條件下,應減少子查詢(即減少全表掃描),可以使用
關聯查詢代替子查詢。
6.用索引提高效率
索引是表的一個概念部分,用來提高檢索數據的效率.通常,通過索引查詢數據比全表掃描要快.
當oracle找出執行查詢 和 update 語句的最佳路徑時, oracle優化器將使用索引. 同樣在聯結多個表時使用 索引也可以提高效率. 另一個使用索引的好處是,它提供了主鍵(primar key)
的唯一 性驗證。
使用所有需要主要兩點:
a. 如果檢索數據量超過 30%的表中記錄數,使用索引將沒有顯著的效率提高。
b. 在特定情況下, 使用索引也許會比全表掃描慢, 但這是同一個數量級上的區別。而通常情況下,使用索引比全表掃描要塊幾倍乃至幾千倍!
7.sql 語句用大寫
因為 oracle 總是先解析 sql 語句,把小寫的字母轉換成大寫的再執行。為減少解析所消耗的時間,建議sql語句使用大寫。
編輯器大小寫轉換快捷鍵(適用於idea和eclipse)
Ctrl+Shift+X 把當前選中的文本全部變為大寫
Ctrl+Shift+Y 把當前選中的文本全部變為小寫