• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    ORACLE SQL性能優化系列 (五)

    發布: 2008-10-27 13:15 | 作者: black_snail  | 來源: net130 | 查看: 44次 | 進入軟件測試論壇討論

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

      

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: oracle ORACLE Oracle sql SQL Sql 性能

    31/3123>

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>