Oracle優化器(RBO與CBO)
在Oracle中80%的效能問題是由SQL語句引起的,而在SQL進行硬解析時會使用Oracle優化器。優化器(Optimizer)是Oracle中內建的一個核心子系統,主要負責成生SQL執行計劃。目前Oracle的優化器分為RBO和CBO兩種型別。
1.RBO優化器
RBO(Rule-Based Optimizer)為一種基於規則的優化器。在RBO中Oracle 為各種執行路徑(Access Path)設定了固定的等級。RBO會根據SQL的諸多執行路徑中,選取等級低的執行路徑最後生成執行計劃。RBO的執行路徑等級分別為:
1、Single Row by Rowid
2、Single Row by Cluster Join
3、Single Row by Hash Cluster Key with Unique or Primary Key
4、Single Row by Unique or Primary Key
5、Clustered Join
6、Hash Cluster Key
7、Indexed Cluster Key
8、Composite Index
9、Single-Column Indexes
10、Bounded Range Search on Indexed Columns
11、Unbounded Range Search on Indexed Columns
12、Sort Merge Join
13、MAX or MIN of Indexed Column
14、ORDER BY on Indexed Column
15、Full Table Scan
其中1級的執行路徑是Single Row by Rowid,等級最高的執行路徑是Full Table Scan,RBO中會認為等級低的執行路徑一定會比等級高的執行路徑效率高(Oracle中rowid表示資料的物理儲存地址,通過rowid查詢單個資料是最快的。索引中會存資料的rowid。)所以在有索引有SQL查詢中,RBO一定會走索引而不會使用等級最高的全表掃描。
RBO優化器在某些時候生成的執行計劃並不是最優,例如:
1.我們知道在查詢的結果集中包括大量資料時,使用全表掃描的效率是要比索引高的。(全表掃描每次會讀取多個資料塊)。
2.在出現執行路徑等級相同的情況時,RBO會根據物件(索引)在資料字典中的順序來選擇執行計劃(不同的索引執行效率不同)。
從Oracle 10g 之後官方已經不推薦使用RBO。
2.CBO優化器
CBO(Cost-Based Optimizer)為一種基於成本的優化器。這裡的成本指的是執行SQL時CUP和I/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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE優化器RBO與CBO介紹總結Oracle優化
- Oracle最佳化器(RBO與CBO)Oracle
- Oracle優化器的RBO和CBO方式Oracle優化
- Oracle的優化器的RBO和CBO方式Oracle優化
- Oracle CBO 與 RBOOracle
- 簡單介紹Oracle的RBO/CBO優化器Oracle優化
- SQL優化器-RBO與CBO分別是什麼SQL優化
- Oracle最佳化器RBO和CBO(轉載)Oracle
- 【效能優化】CBO,RBO在ORACLE中的應用優化Oracle
- Oracle Optimizer CBO RBOOracle
- Oracle的最佳化器的RBO和CBO方式Oracle
- 詳介oracle的RBO/CBO最佳化器 - 轉Oracle
- 【效能優化】CBO,RBO在ORACLE 10g 中的應用優化Oracle 10g
- Oracle的優化器:RBO/CBO,RULE/CHOOSE/FIRST_ROWS/ALL_ROWS 名詞解釋Oracle優化
- Oracle Optimizer -RBO (理解Rule-based 優化器)Oracle優化
- CBO,RBO在ORACLE中的應用Oracle
- CBO RBO簡介
- Oracle Optimizer -RBO (理解Rule-based 優化器)【Blog 搬家】Oracle優化
- Oracle約束Constraint對於CBO優化器的作用OracleAI優化
- 【效能優化】CBO優化器兩個內建的假設優化
- Oracle:RBOOracle
- Oracle學習系列—資料庫優化—RBO訪問路徑Oracle資料庫優化
- 聊聊Cardinality Feedback——一種CBO優化器嘗試優化
- 【CBO】基於成本優化器的基本原則(二)優化
- 【CBO】基於成本優化器的基本原則(一)優化
- 深入淺出Calcite與SQL CBO(Cost-Based Optimizer)優化SQL優化
- Hive使用Calcite CBO優化流程及SQL優化實戰Hive優化SQL
- 使用10053事件跟蹤CBO優化器決策(上)事件優化
- 使用10053事件跟蹤CBO優化器決策(下)事件優化
- oracle 的優化器Oracle優化
- 【摘】 oracle優化器Oracle優化
- Oracle的優化器Oracle優化
- Oracle "腦殘" CBO 最佳化案例Oracle
- CBO Cost Formulas基於成本優化器的成本計算公式大全ORM優化公式
- 基於CBO優化器謂詞選擇率的計算方法優化
- 【sql調優】繫結變數與CBOSQL變數
- 【筆記】oracle 優化器筆記Oracle優化
- Oracle 優化器與sql查詢執行順序Oracle優化SQL