ORACLE SQL效能最佳化系列 (九) (轉)
27. 基礎表的選擇:namespace prefix = o ns = "urn:schemas--com::office" />
基礎表(Driving Table)是指被最先訪問的表(通常以全表掃描的方式被訪問). 根據器的不同, 語句中基礎表的選擇是不一樣的.
如果你使用的是CBO (COST BASED OPTIMIZER),最佳化器會檢查SQL語句中的每個表的物理大小,的狀態,然後選用花費最低的路徑.
如果你用RBO (RULE BASED OPTIMIZER) , 並且所有的連線條件都有索引對應, 在這種情況下, 基礎表就是FROM 子句中列在最後的那個表.
舉例:
A.NAME , B.MANAGER
FROM WORKER A,
LODGING B
WHERE A.LODGING = B.LODING;
由於LODGING表的LODING列上有一個索引, 而且WORKER表中沒有相比較的索引, WORKER表將被作為查詢中的基礎表.
28. 多個平等的索引
當SQL語句的執行路徑可以使用分佈在多個表上的多個索引時, 會同時使用多個索引並在執行時對它們的記錄進行合併, 檢索出僅對全部索引有效的記錄.
在ORACLE選擇執行路徑時,唯一性索引的等級高於非唯一性索引. 然而這個規則只有
當WHERE子句中索引列和常量比較才有效.如果索引列和其他表的索引類相比較. 這種子句在最佳化器中的等級是非常低的.
如果不同表中兩個想同等級的索引將被引用, FROM子句中表的順序將決定哪個會被率先使用. FROM子句中最後的表的索引將有最高的優先順序.
如果相同表中兩個想同等級的索引將被引用, WHERE子句中最先被引用的索引將有最高的優先順序.
舉例:
DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.
SELECT ENAME,
FROM EMP
WHERE DEPT_NO = 20
AND EMP_CAT = ‘A’;
這裡,DEPTNO索引將被最先檢索,然後同EMP_CAT索引檢索出的記錄進行合併. 執行路徑如下:
TABLE ACCESS BY ROWID ON EMP
AND-EQUAL
INDEX RANGE SCAN ON DEPT_IDX
INDEX RANGE SCAN ON CAT_IDX
29. 等式比較和範圍比較
當WHERE子句中有索引列, ORACLE不能合併它們,ORACLE將用範圍比較.
舉例:
DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.
SELECT ENAME
FROM EMP
WHERE DEPTNO > 20
AND EMP_CAT = ‘A’;
這裡只有EMP_CAT索引被用到,然後所有的記錄將逐條與DEPTNO條件進行比較. 執行路徑如下:
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON CAT_IDX
30. 不明確的索引等級
當ORACLE無法判斷索引的等級高低差別,最佳化器將只使用一個索引,它就是在WHERE子句中被列在最前面的.
舉例:
DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.
SELECT ENAME
FROM EMP
WHERE DEPTNO > 20
AND EMP_CAT > ‘A’;
這裡, ORACLE只用到了DEPT_NO索引. 執行路徑如下:
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON DEPT_IDX
譯者按:
我們來試一下以下這種情況:
SQL> select index_name, uniqueness from user_indexes where table_name = 'EMP';
INDEX_NAME UNIQUENES
------------------------------ ---------
EMPNO UNIQUE
EMPTYPE NONUNIQUE
SQL> select * from emp where empno >= 2 and emp_type = 'A' ;
no rows selected
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
2 1 INDEX (RANGE SCAN) OF 'EMPTYPE' (NON-UNIQUE)
雖然EMPNO是唯一性索引,但是由於它所做的是範圍比較, 等級要比非唯一性索引的等式比較低!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-960988/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE SQL效能最佳化系列 (十) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (十一) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (一) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (二) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (三) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (四) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (五) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (八) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (六) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (七) (轉)OracleSQL
- ORACLE SQL效能最佳化系列 (十二) (轉)OracleSQL
- Oracle SQL效能最佳化系列講座之三(轉)OracleSQL
- Oracle SQL效能最佳化系列講座之二(轉)OracleSQL
- Oracle SQL效能最佳化系列講座之一(轉)OracleSQL
- ORACLE SQL效能最佳化系列 (十四) 完結篇 (轉)OracleSQL
- Oracle效能最佳化之SQL最佳化(轉)OracleSQL
- Oracle SQL效能最佳化OracleSQL
- Oracle sql 效能最佳化OracleSQL
- Oracle SQL效能最佳化常用方法OracleSQL
- oracle SQL效能最佳化大總結OracleSQL
- ORACLE SQL效能優化系列 (一)OracleSQL優化
- Oracle SQL的最佳化[轉]OracleSQL
- Oracle SQL效能優化系列介紹OracleSQL優化
- Oracle效能最佳化之應用最佳化(轉)Oracle
- Oracle效能最佳化之最佳化排序操作(轉)Oracle排序
- Oracle效能最佳化之LockContention(轉)Oracle
- SQL最佳化案例-union代替or(九)SQL
- 【Oracle九大效能檢視】之2.v$sqlarea_查效能SQLOracleSQL
- Oracle效能最佳化之Rollback(undo)Segment最佳化(轉)Oracle
- Oracle 11g 中SQL效能最佳化新特性之SQL效能分析器(SQLPA)OracleSQL
- oracle 效能最佳化Oracle
- Oracle效能最佳化之提升block的效率(轉)OracleBloC
- Oracle資料庫效能最佳化技術(轉)Oracle資料庫
- 效能調優——SQL最佳化SQL
- Spark 系列(九)—— Spark SQL 之 Structured APISparkSQLStructAPI
- SQL效能最佳化之索引最佳化法SQL索引
- 效能最佳化之SQL語句最佳化SQL
- 【效能最佳化】ORACLE資料庫效能最佳化概述Oracle資料庫