ORACLESQL性能優(yōu)化系列(九)

字號(hào):

27. 基礎(chǔ)表的選擇
    基礎(chǔ)表(Driving Table)是指被最先訪(fǎng)問(wèn)的表(通常以全表掃描的方式被訪(fǎng)問(wèn)). 根據(jù)優(yōu)化器的不同, SQL語(yǔ)句中基礎(chǔ)表的選擇是不一樣的.
    如果你使用的是CBO (COST BASED OPTIMIZER),優(yōu)化器會(huì)檢查SQL語(yǔ)句中的每個(gè)表的物理大小,索引的狀態(tài),然后選用花費(fèi)最低的執(zhí)行路徑.
    如果你用RBO (RULE BASED OPTIMIZER) , 并且所有的連接條件都有索引對(duì)應(yīng), 在這種情況下, 基礎(chǔ)表就是FROM 子句中列在最后的那個(gè)表.
    舉例:
     SELECT A.NAME , B.MANAGER
     FROM WORKER A,
     LODGING B
     WHERE A.LODGING = B.LODING;
    由于LODGING表的LODING列上有一個(gè)索引, 而且WORKER表中沒(méi)有相比較的索引, WORKER表將被作為查詢(xún)中的基礎(chǔ)表.
    28. 多個(gè)平等的索引
    當(dāng)SQL語(yǔ)句的執(zhí)行路徑可以使用分布在多個(gè)表上的多個(gè)索引時(shí), ORACLE會(huì)同時(shí)使用多個(gè)索引并在運(yùn)行時(shí)對(duì)它們的記錄進(jìn)行合并, 檢索出僅對(duì)全部索引有效的記錄.
    在ORACLE選擇執(zhí)行路徑時(shí),性索引的等級(jí)高于非性索引. 然而這個(gè)規(guī)則只有
    當(dāng)WHERE子句中索引列和常量比較才有效.如果索引列和其他表的索引類(lèi)相比較. 這種子句在優(yōu)化器中的等級(jí)是非常低的.
    如果不同表中兩個(gè)想同等級(jí)的索引將被引用, FROM子句中表的順序?qū)Q定哪個(gè)會(huì)被率先使用. FROM子句中最后的表的索引將有的優(yōu)先級(jí).
    如果相同表中兩個(gè)想同等級(jí)的索引將被引用, WHERE子句中最先被引用的索引將有的優(yōu)先級(jí).
    舉例:
     DEPTNO上有一個(gè)非性索引,EMP_CAT也有一個(gè)非性索引.
     SELECT ENAME,
     FROM EMP
     WHERE DEPT_NO = 20
     AND EMP_CAT = ‘A’;
    這里,DEPTNO索引將被最先檢索,然后同EMP_CAT索引檢索出的記錄進(jìn)行合并. 執(zhí)行路徑如下:
    TABLE ACCESS BY ROWID ON EMP
     AND-EQUAL
     INDEX RANGE SCAN ON DEPT_IDX
     INDEX RANGE SCAN ON CAT_IDX
    29. 等式比較和范圍比較
     當(dāng)WHERE子句中有索引列, ORACLE不能合并它們,ORACLE將用范圍比較.
     舉例:
     DEPTNO上有一個(gè)非性索引,EMP_CAT也有一個(gè)非性索引.
     SELECT ENAME
     FROM EMP
     WHERE DEPTNO > 20
     AND EMP_CAT = ‘A’;
     這里只有EMP_CAT索引被用到,然后所有的記錄將逐條與DEPTNO條件進(jìn)行比較. 執(zhí)行路徑如下:
     TABLE ACCESS BY ROWID ON EMP
     INDEX RANGE SCAN ON CAT_IDX
    30. 不明確的索引等級(jí)
    當(dāng)ORACLE無(wú)法判斷索引的等級(jí)高低差別,優(yōu)化器將只使用一個(gè)索引,它就是在WHERE子句中被列在最前面的.
     舉例:
     DEPTNO上有一個(gè)非性索引,EMP_CAT也有一個(gè)非性索引.
     SELECT ENAME
     FROM EMP
     WHERE DEPTNO > 20
     AND EMP_CAT > ‘A’;
     這里, ORACLE只用到了DEPT_NO索引. 執(zhí)行路徑如下:
     TABLE ACCESS BY ROWID ON EMP
     INDEX RANGE SCAN ON DEPT_IDX
    譯者按:
    我們來(lái)試一下以下這種情況: