Vincent.Chan‘s Blog

          常用鏈接

          統(tǒng)計

          積分與排名

          網(wǎng)站

          最新評論

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

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

          作者: black_snail

           

          關(guān)鍵字 ORACLE PL/SQL TUNING PERFORMANCE

          出處 http://www.dbasupport.com



          27. 基礎(chǔ)表的選擇


          基礎(chǔ)表(Driving Table)是指被最先訪問的表(通常以全表掃描的方式被訪問). 根據(jù)優(yōu)化器的不同, SQL語句中基礎(chǔ)表的選擇是不一樣的.

          如果你使用的是CBO (COST BASED OPTIMIZER),優(yōu)化器會檢查SQL語句中的每個表的物理大小,索引的狀態(tài),然后選用花費最低的執(zhí)行路徑.

          如果你用RBO (RULE BASED OPTIMIZER) , 并且所有的連接條件都有索引對應(yīng), 在這種情況下, 基礎(chǔ)表就是FROM 子句中列在最后的那個表.

          舉例:

          SELECT A.NAME , B.MANAGER

          FROM WORKER A,

          LODGING B

          WHERE A.LODGING = B.LODING;

          由于LODGING表的LODING列上有一個索引, 而且WORKER表中沒有相比較的索引, WORKER表將被作為查詢中的基礎(chǔ)表.



          28. 多個平等的索引

          當(dāng)SQL語句的執(zhí)行路徑可以使用分布在多個表上的多個索引時, ORACLE會同時使用多個索引并在運行時對它們的記錄進行合并, 檢索出僅對全部索引有效的記錄.

          在ORACLE選擇執(zhí)行路徑時,唯一性索引的等級高于非唯一性索引. 然而這個規(guī)則只有

          當(dāng)WHERE子句中索引列和常量比較才有效.如果索引列和其他表的索引類相比較. 這種子句在優(yōu)化器中的等級是非常低的.

          如果不同表中兩個想同等級的索引將被引用, FROM子句中表的順序?qū)Q定哪個會被率先使用. FROM子句中最后的表的索引將有最高的優(yōu)先級.

          如果相同表中兩個想同等級的索引將被引用, WHERE子句中最先被引用的索引將有最高的優(yōu)先級.

          舉例:

          DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.

          SELECT ENAME,

          FROM EMP

          WHERE DEPT_NO = 20

          AND EMP_CAT = ‘A';

          這里,DEPTNO索引將被最先檢索,然后同EMP_CAT索引檢索出的記錄進行合并. 執(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上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.

          SELECT ENAME

          FROM EMP

          WHERE DEPTNO > 20

          AND EMP_CAT = ‘A';



          這里只有EMP_CAT索引被用到,然后所有的記錄將逐條與DEPTNO條件進行比較. 執(zhí)行路徑如下:

          TABLE ACCESS BY ROWID ON EMP

          INDEX RANGE SCAN ON CAT_IDX



          30. 不明確的索引等級


          當(dāng)ORACLE無法判斷索引的等級高低差別,優(yōu)化器將只使用一個索引,它就是在WHERE子句中被列在最前面的.

          舉例:

          DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引.


          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


          譯者按:

          我們來試一下以下這種情況:

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

          posted on 2006-02-25 22:32 Vincent.Chen 閱讀(171) 評論(0)  編輯  收藏 所屬分類: Database

          主站蜘蛛池模板: 图木舒克市| 冀州市| 德清县| 昭通市| 视频| 南雄市| 宁远县| 泗洪县| 华容县| 昭通市| 镇宁| 大名县| 肇东市| 东海县| 沅江市| 南安市| 阜阳市| 怀来县| 吴桥县| 霍林郭勒市| 宁国市| 香河县| 剑阁县| 茶陵县| 榆树市| 葵青区| 修武县| 武强县| 湘乡市| 囊谦县| 泰宁县| 仙桃市| 塔河县| 永顺县| 东丽区| 姜堰市| 佛冈县| 石阡县| 隆德县| 巩留县| 长武县|