海鷗航際

          JAVA站
          posts - 11, comments - 53, trackbacks - 1, articles - 102
           

          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)試一下以下這種情況:

          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是唯一性索引,但是由于它所做的是范圍比較, 等級(jí)要比非唯一性索引的等式比較低!

           

           


          主站蜘蛛池模板: 内江市| 临泉县| 嘉禾县| 新沂市| 蓝山县| 林西县| 政和县| 长岭县| 温州市| 买车| 普兰县| 洪湖市| 商河县| 珲春市| 庆城县| 电白县| 阿坝县| 平阳县| 临夏县| 广宁县| 麻栗坡县| 全椒县| 津市市| 东乡族自治县| 杨浦区| 安阳县| 乐山市| 子长县| 江口县| 商南县| 绵阳市| 梧州市| 谷城县| 即墨市| 亳州市| 拜城县| 绵阳市| 洪泽县| 特克斯县| 靖边县| 安远县|