2012年3月4日 星期日

[分享] Oracle中存儲過程和Sql語句的優化重點

http://forum.twbts.com/thread-5944-1-1.html


整理文件時,發現幾年前搜集到的一些文件,出處已不知了,不過內容蠻受用,分享給大家。
1.        全表掃描和索引掃描
1.1        大資料量表儘量要避免全表掃描,全部掃描會按順序每條記錄掃描,對於>100萬資料表影響很大。
1.2        Oracle中通過RowID訪問資料是最快的方式
1.3        對欄位進行函數轉換,或者前模糊查詢都會導致無法應用索引而進行全表掃描
1.4        對Oracle共用池和緩衝區中的Sql必須要大小寫都完全用上才能夠匹配上
2        順序問題
2.1        Oracle按照從右到左的順序對資料表進行解析。因此From最後面的表為基礎表,一般要選擇記錄數最少的表作為基礎表。
2.2        對於Where條件的順序,過濾到最大查詢記錄數量的條件必須寫在Where條件的結尾處。
2.3        Where條件中涉及到使用複雜函數判定的必須注意要寫到Where條件的最前面
3        索引方面
3.1        記錄數少的表保留有主鍵索引就可以了,不要再去建其他索引,全表掃描也很快
3.2        索引最好單獨建立表空間,必要時候對索引進行重建
3.3        必要時候可以使用函數索引,但不推薦使用
3.4        Oracle中的視圖也可以增加索引,但一般不推薦使用
3.5        *Sql語句中大量使用函數時候會導致很多索引無法使用上,要針對具體問題分析
4        其他
4.1        避免使用Select *,因為系統需要去幫你將*轉換為所有的列名,這個需要額外去查詢資料字典。
4.2        Count(1)和Count(*)差別不大。
4.3        多使用Decode函數來作簡單的代碼和名稱間的轉換,以減少表關聯
4.4        使用Truncate替代delete來刪除記錄,但Truncate資料不記錄日誌,無法進行回滾
4.5        對於複雜的存儲過程可以多次提交的資料的要多分多次Commit,否則長事務對系統性能影響很大
4.6        Distinct和Having子句都是耗時操作,應該盡可能少使用
4.7        在不需要考慮重複記錄合併時候用Union All來代替Union
4.8        使用顯性游標而不使用隱性游標,特別是大資料量情況下隱性游標對性能影響很大
4.9        是否使用函數的問題
4.10        用直接的表關聯來代替Exist.用Exist或Not Exists來代理In。In進行子查詢效率很差。
5        SQL語句分析
5.1        通過SQLPLUS中的SET TRACE 功能對Sql語句的性能進行分析
5.2        通過Toad或PL/SQL Developer對語句的性能進行和索引的使用情況進行分析
5.3        對Oracle缺省的優化不滿意可以強制使用Hint,但一般不推薦使用
5.4        對Flag等只存儲是或否資訊的欄位,一般不推薦建立索引。必要可以採用點陣圖索引
5.5        *存在遞迴查詢情況如果關聯Table太多對性能會造成較大影響,往往推薦採用臨時表轉為分步驟操作提高性能
5.6        *儘量使用表關聯查詢而不使用函數,但涉及類似於代碼表要重複關聯多次取資料問題時候又適合使用函數

沒有留言:

張貼留言