本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。
27. 基礎表的選擇
基礎表(driving table)是指被最先訪問的表(通常以全表掃描的方式被訪問). 根據優化器的不同, sql語句中基礎表的選擇是不一樣的.
如果你使用的是cbo (cost based optimizer),優化器會檢查sql語句中的每個表的物理大小,索引的狀態,然后選用花費最低的執行路徑.
如果你用rbo (rule based optimizer) , 并且所有的連接條件都有索引對應, 在這種情況下, 基礎表就是from 子句中列在最后的那個表.
舉例:
select a.name , b.manager
from worker a,
lodging b
where a.lodging = b.loding;
由于lodging表的loding列上有一個索引, 而且worker表中沒有相比較的索引, worker表將被作為查詢中的基礎表.
28. 多個平等的索引
當sql語句的執行路徑可以使用分布在多個表上的多個索引時, oracle會同時使用多個索引并在運行時對它們的記錄進行合并, 檢索出僅對全部索引有效的記錄.
在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是唯一性索引,但是由于它所做的是范圍比較, 等級要比非唯一性索引的等式比較低!