Oracle優化器(RBO與CBO)

DBA_建瑾發表於2013-11-23
      
    
Oracle80%的效能問題是由SQL語句引起的,而在SQL進行硬解析時會使用Oracle優化器。優化器(Optimizer)是Oracle中內建的一個核心子系統,主要負責成生SQL執行計劃。目前Oracle的優化器分為RBOCBO兩種型別。
    1.RBO優化器
    RBORule-Based Optimizer)為一種基於規則的優化器。在RBOOracle 為各種執行路徑(Access Path)設定了固定的等級。RBO會根據SQL的諸多執行路徑中,選取等級低的執行路徑最後生成執行計劃。RBO的執行路徑等級分別為:
    1Single Row by Rowid
    2Single Row by Cluster Join
    3Single Row by Hash Cluster Key with Unique or Primary Key
    4Single Row by Unique or Primary Key
    5Clustered Join
    6Hash Cluster Key
    7Indexed Cluster Key
    8Composite Index
    9Single-Column Indexes
    10Bounded Range Search on Indexed Columns
    11Unbounded Range Search on Indexed Columns
    12Sort Merge Join
    13MAX or MIN of Indexed Column
    14ORDER BY on Indexed Column
    15Full Table Scan
    其中1級的執行路徑是Single Row by Rowid,等級最高的執行路徑是Full Table ScanRBO中會認為等級低的執行路徑一定會比等級高的執行路徑效率高(Oraclerowid表示資料的物理儲存地址,通過rowid查詢單個資料是最快的。索引中會存資料的rowid。)所以在有索引有SQL查詢中,RBO一定會走索引而不會使用等級最高的全表掃描。

RBO優化器在某些時候生成的執行計劃並不是最優,例如:

1.我們知道在查詢的結果集中包括大量資料時,使用全表掃描的效率是要比索引高的。(全表掃描每次會讀取多個資料塊)。

2.在出現執行路徑等級相同的情況時,RBO會根據物件(索引)在資料字典中的順序來選擇執行計劃(不同的索引執行效率不同)。

Oracle 10g 之後官方已經不推薦使用RBO

2.CBO優化器

CBOCost-Based Optimizer)為一種基於成本的優化器。這裡的成本指的是執行SQLCUPI/O消耗的量(這裡的消耗量是Oracle根據統計資訊生成的一個估算值)。CBO在解析SQL時,會從諸多執行路徑中選擇成本最小的生成執行計劃。CBO會根據物件的統計資訊計算成本(統計資訊中記錄著物件的資料量等資訊),這意味著CBO解析會比RBO更智慧,CBO將會比較執行路徑生成效率較高的執行計劃。那麼CBO就一定是完美的選擇嗎?

    在某些情況下CBO會有些侷限性,例如:
    
1.CBO在計算成本時是按統計資訊中的資料計算的,而統計資訊每天只更新一次,如果統計資訊更新前後資料量存在巨大差距會影響CBO選擇錯誤的執行計劃。
    
2.CBO在計算成本時不會考慮DB Buffer Cache,如果DB Buffer Cache中已經快取了要查詢的資料時,是不需要耗費I/O去資料檔案讀取的。所以CBO可能會高估相關執行路徑而選擇錯誤執行計劃。
    
3.直方圖統計資訊方面的不足可能會影響CBO選擇錯誤執行計劃。
    
4.在多表關聯查詢時,表之間的關聯順序會呈幾何級的增長,各種可能生成的執行計劃數量可能非常龐大,所以CBO只能在前2000種可能的執行計劃中選一個,這就可能漏掉最優的執行計劃。

DBA_建瑾

2013.11.23

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29324876/viewspace-777426/,如需轉載,請註明出處,否則將追究法律責任。

相關文章