ORACLE SQL效能最佳化系列 (九)

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.