Oracle Optimizer -RBO (理解Rule-based 優化器)
/*
理解Rule-based 優化器
RBO 優先使用預定義方法去計算使用的某條路徑訪問資料庫資料.
RDBMS 使用下列條件則優先選擇RBO的優化器.包括:
在init.ora 檔案中設定OPTIMIZER_MODE = RULE
在init.ora 檔案中設定OPTIMIZER_MODE = choose,並且在SQL 中所包含的Table 沒有統計資料.
在Session 中使用 alter session set optimizer_mode=rule
在Session 中使用 Alter session set optomizer_mode=Choose 命令,並且SQL 中的任何table 都沒有統計資料
Rule hint (例如 select /*+RULE*/....) 在SQL 中強制使用RBO
*/
---RBO rule-based optimizer
--(EMP_NO,EMP_NAME,EMP_CLASS,DEPT_NO,EMP_CATEGORY,COST_CENTER)
--Case 1: (In fact, only the two-column index is used;
-- the single-column index is not used. While Oracle will merge two single-column indexes,
-- it will not merge a multi-column index with another index. )
ALTER session SET optimizer_mode=rule ;
CREATE INDEX idx_1 ON emp(dept_no) ;
CREATE INDEX idx_2 ON emp(emp_no,emp_name);
SELECT emp_no,DEPT_NO,COST_CENTER
FROM emp
WHERE emp_no = 2
AND emp_name = 'PJWANG'
AND dept_no = '12'
---未Create Index 時
-- Execution Plan
----------------------------------------------------------
-- 0 SELECT STATEMENT Optimizer=RULE
-- 1 0 TABLE ACCESS (FULL) OF 'EMP'
-- Create index idx_1 (dept_no)
--( 上面SQL where subclause 怎麼組合都會用到 Idx_1)
CREATE INDEX idx_1 ON emp(dept_no) ;
--Execution Plan
----------------------------------------------------------
-- 0 SELECT STATEMENT Optimizer=RULE
-- 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
-- 2 1 INDEX (RANGE SCAN) OF 'IDX_1' (NON-UNIQUE)
CREATE INDEX idx_2 ON emp(emp_no,emp_name);
--(上面的SQL 語句會用到idx_2,因為Idx_2 的columns 比較多且接近Where 後面的 欄位)
--Execution Plan
----------------------------------------------------------
-- 0 SELECT STATEMENT Optimizer=RULE
-- 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
-- 2 1 INDEX (RANGE SCAN) OF 'IDX_2' (NON-UNIQUE)
--Case 2:
---(如果index不是所有Column 在where 子句中,sql 則選擇一些Column 在同一個Index 中的Index)
--( Lis: 如果index 中的所有欄位在SQL 上,那肯定選擇此index,如果此index 包含其他欄位,而這些欄位沒有在
-- SQL 中.則SQL 選擇Where 條件後儘可能多的欄位在同一個Index's index)
CREATE INDEX idx_3 ON emp(emp_no,emp_name,dept_no,cost_center);
/*
SELECT emp_no,DEPT_NO,COST_CENTER
FROM emp
WHERE emp_no = 2
AND emp_name = 'PJWANG'
AND dept_no = '12' --AND cost_center='RD Center'
*/
-- Execution Plan
----------------------------------------------------------
-- 0 SELECT STATEMENT Optimizer=RULE
-- 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
-- 2 1 INDEX (RANGE SCAN) OF 'IDX_2' (NON-UNIQUE) --Idx_3
--Case 3: (多個Index 都包含 Where 相同個數的Column,則SQL 選擇 最後一個建立的index)
-- CREATE INDEX idx_2 ON emp(emp_no,emp_name);
--drop index idx_3.
CREATE INDEX idx_4 ON emp(dept_no,cost_center);
--(idx_2,idx_4 的欄位都在SQL 中,且個數相同,且不會因為Where 後面Column 順序改變而選擇不同的Index)
-- Execution Plan
----------------------------------------------------------
-- 0 SELECT STATEMENT Optimizer=RULE
-- 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
-- 2 1 INDEX (RANGE SCAN) OF 'IDX_4' (NON-UNIQUE)
---Case 4: (如果Where 子句中的多個Column 在 不同的 Index 中, "=" 操作的Index 將替換 如Like,between 之類的Index)
CREATE INDEX idx_3 ON emp(emp_no,emp_name,dept_no,cost_center);
SELECT emp_no,DEPT_NO,COST_CENTER
FROM emp
WHERE emp_no = 2
AND emp_name LIKE 'PJWAN%'
AND dept_no = '12'
AND cost_center='RD Center'
--
--Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=RULE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
2 1 INDEX (RANGE SCAN) OF 'IDX_4' (NON-UNIQUE)
----如果是Between 則
SELECT emp_no,DEPT_NO,COST_CENTER
FROM emp
WHERE emp_no = 2
AND emp_name = 'PJWANG'
AND dept_no BETWEEN '12' AND '20'
AND cost_center='RD Center'
--Execution Plan
----------------------------------------------------------
-- 0 SELECT STATEMENT Optimizer=RULE
-- 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
-- 2 1 INDEX (RANGE SCAN) OF 'IDX_2' (NON-UNIQUE)
----如果全部是"="
SELECT emp_no,DEPT_NO,COST_CENTER
FROM emp
WHERE emp_no = 2
AND emp_name = 'PJWANG'
AND dept_no = '12'
AND cost_center='RD Center'
--Execution Plan
----------------------------------------------------------
-- 0 SELECT STATEMENT Optimizer=RULE
-- 1 0 INDEX (RANGE SCAN) OF 'IDX_3' (NON-UNIQUE)
--Case 5:( where 子句的多個欄位在不同的index 中,則Where 子句中Column 在Index 佔Index 所有column 的百分率高的會被採用)
--( 所有Index 中的欄位都沒有全部被Where 子句包含)
-- drop index idx_2;
--drop index idx_1;
CREATE INDEX idx_5 ON emp(emp_no,emp_category);
-- CREATE INDEX idx_3 ON emp(emp_no,emp_name,dept_no,cost_center);
SELECT emp_no,DEPT_NO,COST_CENTER
FROM emp
WHERE emp_no = 2
AND emp_name = 'PJWANG'
AND dept_no='12'
AND emp_class='IE'
--百分率不同: idx_3=(emp_no+emp_name+dept_no)/4=75%
-- idx_5=(emp_no)/2=50%
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=RULE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
2 1 INDEX (RANGE SCAN) OF 'IDX_3' (NON-UNIQUE)
--- 百分率相同 則選最後一個建立的: idx_3=(emp_no+emp_name)/4=50%
-- idx_5=(emp_no)/2=50%
SELECT emp_no,DEPT_NO,COST_CENTER
FROM emp
WHERE emp_no = 2
AND emp_name = 'PJWANG'
AND emp_category='HI1'
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=RULE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
2 1 INDEX (RANGE SCAN) OF 'IDX_5' (NON-UNIQUE)
--Case 6: (如果兩個Index 包含相同的Column ,SQL在使用時會使用和Where 後面第一個Column 相同並且是index第一個column的 index)
-- CREATE INDEX idx_5 ON emp(emp_no,emp_category);
CREATE INDEX idx_6 ON emp( emp_category,emp_no);
SELECT emp_no,DEPT_NO,COST_CENTER
FROM emp
WHERE emp_no = 2
--此SQL 的第一個欄位在Idx_5 中是第一個,則選中idx_5
--Execution Plan
----------------------------------------------------------
-- 0 SELECT STATEMENT Optimizer=RULE
-- 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
-- 2 1 INDEX (RANGE SCAN) OF 'IDX_5' (NON-UNIQUE)
SELECT emp_no,DEPT_NO,COST_CENTER
FROM emp
WHERE emp_category='HI1'
--此SQL 的第一個欄位在Idx_6 中是第一個,則選中idx_6
--Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=RULE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
2 1 INDEX (RANGE SCAN) OF 'IDX_6' (NON-UNIQUE)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/34596/viewspace-797998/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Optimizer -RBO (理解Rule-based 優化器)【Blog 搬家】Oracle優化
- Oracle Optimizer CBO RBOOracle
- Oracle優化器(RBO與CBO)Oracle優化
- 深入理解oracle優化器統計資料(Optimizer Statistics)Oracle優化
- Oracle優化器的RBO和CBO方式Oracle優化
- Oracle的優化器的RBO和CBO方式Oracle優化
- ORACLE優化器RBO與CBO介紹總結Oracle優化
- 簡單介紹Oracle的RBO/CBO優化器Oracle優化
- Oracle控制優化器偏好--optimizer_mode引數Oracle優化
- Oracle最佳化器(RBO與CBO)Oracle
- 【效能優化】CBO,RBO在ORACLE中的應用優化Oracle
- 淺談optimizer_mode優化器模式優化模式
- Oracle最佳化器RBO和CBO(轉載)Oracle
- Oracle 優化引數 optimizer_mode 介紹Oracle優化
- SQL優化器-RBO與CBO分別是什麼SQL優化
- Oracle的最佳化器的RBO和CBO方式Oracle
- 詳介oracle的RBO/CBO最佳化器 - 轉Oracle
- Oracle:RBOOracle
- Oracle的優化器:RBO/CBO,RULE/CHOOSE/FIRST_ROWS/ALL_ROWS 名詞解釋Oracle優化
- 【效能優化】CBO,RBO在ORACLE 10g 中的應用優化Oracle 10g
- Oracle學習系列—資料庫優化—RBO訪問路徑Oracle資料庫優化
- 說一說Oracle的最佳化器(Optimizer) (轉)Oracle
- Oracle9i, 10g 優化模式 OPTIMIZER_MODEOracle優化模式
- AI學習筆記——Tensorflow中的Optimizer(優化器)AI筆記優化
- oracle sql tuning 10 理解優化器訪問路徑OracleSQL優化
- Oracle CBO 與 RBOOracle
- oracle 的優化器Oracle優化
- 【摘】 oracle優化器Oracle優化
- Oracle的優化器Oracle優化
- Oracle OptimizerOracle
- 06、MySQL Case-通過optimizer_trace看優化器行為MySql優化
- oracle sql tuning 9--理解優化器訪問路徑OracleSQL優化
- 【筆記】oracle 優化器筆記Oracle優化
- Deep Learning模型中常見的optimizer優化器演算法總結模型優化演算法
- 深度學習的優化器(各類 optimizer 的原理、優缺點及數學推導)深度學習優化
- Oracle Optimizer:遷移到使用基於成本的最佳化器-----系列1.1 (轉)Oracle
- Nebula Graph 原始碼解讀系列 | Vol.04 基於 RBO 的 Optimizer 實現原始碼
- jvm優化理解JVM優化