国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

ORACLE SQL性能優化系列 (九)

2024-08-29 13:30:38
字體:
來源:轉載
供稿:網友
  • 本文來源于網頁設計愛好者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是唯一性索引,但是由于它所做的是范圍比較, 等級要比非唯一性索引的等式比較低!

     

     
    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 沐川县| 大名县| 襄樊市| 湘潭县| 永嘉县| 西吉县| 崇明县| 理塘县| 晋城| 亳州市| 横山县| 新疆| 遂昌县| 安溪县| 元阳县| 丹寨县| 商城县| 陆良县| 大同市| 平和县| 中卫市| 隆化县| 达州市| 尚义县| 逊克县| 聂荣县| 偏关县| 景德镇市| 龙门县| 银川市| 河间市| 疏附县| 华容县| 洛宁县| 万年县| 六安市| 讷河市| 巴里| 肥西县| 抚州市| 南江县|