對所有的關係型資料庫而言,最佳化器無疑使其中最核心的部分,因為最佳化器負責解析SQL,而我們又都是通過SQL來訪問儲存在關係型資料庫中的資料的。所有最佳化器的好壞直接決定該關係型資料庫的強弱。
那什麼是最佳化器呢(Optimizer)?最佳化器是ORACLE資料庫中內建的一個核心子系統,你也可以把他理解成是ORACLE資料庫中一個核心模組或者一個核心功能組件。最佳化器的目的是按照一定的判斷原則來得到它認為的目標SQL在當前情形下最高的執行路徑(Access Path),也就是說,最佳化器的目的就是得到目標SQL的執行計畫。
Oracle的最佳化器(Optimizer)分為RBO(Rlue-Based Optimizer:基於規則的最佳化器)和CBO(Cost-Based Optimizer基於成本的最佳化器)這兩中類型.為了得到目標SQL的執行計畫,RBO所用的判斷原則為一組內建的規則,這些規則是寫入程式碼在ORACLE資料庫代碼中的,RBO會根據這些規則從目標SQL諸多的可能的執行計畫中選擇一個來 作為其執行計畫;而CBO所用的判斷原則為成本,CBO會從目標SQL諸多可能的執行路徑中選擇成本值最小的一條來作為其執行計畫,各個執行路徑的成本值是根據目標SQL語句所涉及的表,索引,列等相關對象的統計資訊計算出來的。
其中在這個解析的過程中,ORACLE會執行對目標SQL的文法,語義和許可權檢查。
上面提到基於規則的最佳化器(RBO)是通過寫入程式碼在ORACLE資料庫代碼中的一系列固定的規則,來決定目標SQL的執行計畫的。具體就是ORACLE設定了1到15個等級,其中1等級表示執行效率最高,15對應的執行路徑的執行效率最低。在ORACLE資料庫裡,對應OLTP類型的SQL語句而言,顯然通過ROWID來訪問時效率最高的方式,而通過全表掃描來訪問的效率是最低的。於是,對應的等級1的執行路徑是“single row by rowid(通過ROWID來訪問單行資料)”,而等級15是“full table scan(全表掃描)”。
RBO在ORACLE中由來已久,雖然ORACLE 10G開始,RBO已經不再被ORACLE支援,但是RBO相關的功能並沒有從ORACLE中移除。