<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的漫漫程序之旅

    專注于JavaWeb開發(fā)
    隨筆 - 39, 文章 - 310, 評(píng)論 - 411, 引用 - 0
    數(shù)據(jù)加載中……

    使用虛擬索引進(jìn)行數(shù)據(jù)庫(kù)優(yōu)化

    在數(shù)據(jù)庫(kù)優(yōu)化中,索引的重要性不言而喻。但是,在性能調(diào)整過(guò)程中,一個(gè)索引是否能被查詢用到,在索引創(chuàng)建之前是無(wú)法確定的,而創(chuàng)建索引是一個(gè)代價(jià)比較高的操作,尤其是數(shù)據(jù)量較大的時(shí)候。

    虛擬索引(Virtual Index)不是物理存在的,它并不會(huì)創(chuàng)建實(shí)際的索引段,只是在數(shù)據(jù)字典中加了一個(gè)索引的記錄,使得優(yōu)化器能夠意識(shí)到一個(gè)索引的存在,從而判斷是否使用該索引作為訪問(wèn)路徑。當(dāng)然,實(shí)際上最終查詢的訪問(wèn)路徑是不會(huì)使用該虛擬索引的。

    所以,虛擬索引的用處就是用來(lái)判斷一個(gè)索引對(duì)于sql的執(zhí)行計(jì)劃的影響,尤其是對(duì)整個(gè)數(shù)據(jù)庫(kù)的影響,從而判斷是否需要?jiǎng)?chuàng)建物理索引。

    oracle文檔中并沒(méi)有提到虛擬索引的創(chuàng)建語(yǔ)法,實(shí)際上就是普通索引語(yǔ)法后面加一個(gè)nosegment關(guān)鍵字即可,B*Tree index和bitmap index都可以。

    不同版本的虛擬索引的特性可能不一樣,本文的例子執(zhí)行環(huán)境為:

    NING@ning>select * from v$version;
     
    BANNER
    --------------------------------------------------------------
    --
    Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod

    PL/SQL Release 10.2.0.3.0 - Production
    CORE    10.2.0.3.0      Production
    TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
    NLSRTL Version 10.2.0.3.0 - Production

    1.創(chuàng)建虛擬索引

    NING@ning>create table test(id int,name varchar2(30));
     
    Table created.
     
    NING@ning>insert into test select rownum,object_name from all_objects where rownum<1001;
     
    1000 rows created.
     
    NING@ning>commit;
     
    Commit complete.
     
    NING@ning>create unique index ix_test on test(id) nosegment;
     
    Index created.
     
    NING@ning>analyze table test compute statistics;
     
    Table analyzed.

    2.使用虛擬索引

    NING@ning>explain plan for select * from test where id=1;
     
    Explained.
     
    NING@ning>select * from table(dbms_xplan.display());
     
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------
    --
    Plan hash value: 1357081020

     
    ------------------------------------------------------------------------
    --
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

    ------------------------------------------------------------------------
    --
    |   0 | SELECT STATEMENT  |      |     1 |    17 |     3   (0)| 00:00:01 |

    |* 
    1TABLE ACCESS FULL| TEST |     1 |    17 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------

    必須設(shè)置隱含參數(shù)”_use_nosegment_indexes”=true(默認(rèn)為false)后,CBO才能使用虛擬索引ix_test

    NING@ning>alter session set "_use_nosegment_indexes"=true;
     
    Session altered.
     
    NING@ning>select * from table(dbms_xplan.display());
     
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------
    --
    Plan hash value: 166686173

     
    --------------------------------------------------------------------------
    --
    | Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

    --------------------------------------------------------------------------
    --
    |   0 | SELECT STATEMENT            |         |     1 |    17 |     2   (0)| 00:00:01 |

    |   
    1TABLE ACCESS BY INDEX ROWID| TEST    |     1 |    17 |     2   (0)| 00:00:01 |
    |* 
    2 |   INDEX UNIQUE SCAN         | IX_TEST |     1 |       |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------

    RBO無(wú)法使用虛擬索引

    NING@ning>alter session set optimizer_mode=rule;
     
    Session altered.
     
    NING@ning>explain plan for select * from test where id=1;
     
    Explained.
     
    NING@ning>select * from table(dbms_xplan.display());
     
    PLAN_TABLE_OUTPUT
    ---------------------------------------------------------
    --
    Plan hash value: 1357081020

     
    --------------------------------
    --
    | Id  | Operation         | Name |

    --------------------------------
    --
    |   0 | SELECT STATEMENT  |      |

    |* 
    1TABLE ACCESS FULL| TEST |
    --------------------------------------------------------------

    RBO使用hint可以使用虛擬索引

    NING@ning>explain plan for select /*+ index(test,ix_test)*/* from test where id=1;
     
    Explained.
     
    NING@ning>select * from table(dbms_xplan.display());
     
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------
    --
    Plan hash value: 166686173

     
    -------------------------------------------------------------------------
    --
    | Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

    -------------------------------------------------------------------------
    --
    |   0 | SELECT STATEMENT            |         |     1 |    17 |     2   (0)| 00:00:01 |

    |   
    1TABLE ACCESS BY INDEX ROWID| TEST    |     1 |    17 |     2   (0)| 00:00:01 |
    |* 
    2 |   INDEX UNIQUE SCAN         | IX_TEST |     1 |       |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------

    3.虛擬索引的特性

    無(wú)法執(zhí)行alter index

    NING@ning>alter index ix_test rebuild;
    alter index ix_test rebuild
    *
    ERROR at line 1:
    ORA-08114: can not alter a fake index
     
    NING@ning>alter index ix_test rename to ix_test2;
    alter index ix_test rename to ix_test2
    *
    ERROR at line 1:
    ORA-08114: can not alter a fake index

    不能創(chuàng)建和虛擬索引同名的實(shí)際索引

    NING@ning>create index ix_test on test(name);
    create index ix_test on test(name)
                 *
    ERROR at line 1:
    ORA-00955: name is already used by an existing object

    可以創(chuàng)建和虛擬索引包含相同列但不同名的實(shí)際索引

    NING@ning>create index ix_test2 on test(id);
     
    Index created.

    在10g使用回收站特性的時(shí)候,虛擬索引必須顯式drop,或者在drop table后purge table后,才能創(chuàng)建同名的索引

    NING@ning>drop table test;
     
    Table dropped.
     
    NING@ning>create unique index ix_test on test2(id);
    create unique index ix_test on test2(id)
                        *
    ERROR at line 1:
    ORA-00955: name is already used by an existing object
     
    NING@ning>drop index ix_test;
    drop index ix_test
               *
    ERROR at line 1:
    ORA-38301: can not perform DDL/DML over objects in Recycle Bin
     
    NING@ning>purge table test;
     
    Table purged.
     
    NING@ning>create unique index ix_test on test2(id);
     
    Index created.

    查找系統(tǒng)中已經(jīng)存在的虛擬索引:

    SELECT index_owner, index_name 
    FROM dba_ind_columns
    WHERE index_name NOT LIKE 'BIN$%'
    MINUS
    SELECT owner, index_name
    FROM dba_indexes;

    虛擬索引分析并且有效,但是數(shù)據(jù)字典里查不到結(jié)果,估計(jì)是oracle內(nèi)部臨時(shí)保存了分析結(jié)果



    posted on 2008-04-29 10:20 々上善若水々 閱讀(798) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

    主站蜘蛛池模板: 深夜免费在线视频| 久久国产乱子伦精品免费不卡| 国内自产少妇自拍区免费| 亚洲a∨国产av综合av下载| 中文字幕亚洲日本岛国片| 亚洲视频在线免费观看| 亚洲精品亚洲人成在线| 亚洲精品乱码久久久久66| 日韩不卡免费视频| 一个人免费观看www视频| 亚洲黄色中文字幕| 免费国产成人高清在线观看麻豆 | 中国xxxxx高清免费看视频| 亚洲情A成黄在线观看动漫软件 | 日本亚洲中午字幕乱码| 国产AV无码专区亚洲AV男同| 国产1024精品视频专区免费| 国产日韩在线视频免费播放| 自拍日韩亚洲一区在线| 亚洲五月综合缴情在线观看| 成人特黄a级毛片免费视频| a级片免费在线播放| 亚洲丁香婷婷综合久久| 亚洲成色在线影院| 亚洲 小说区 图片区 都市| 在线看免费观看AV深夜影院| 人妖系列免费网站观看| 四虎精品成人免费视频| 污污免费在线观看| 亚洲综合精品伊人久久| 久久精品国产亚洲av麻豆色欲 | 亚洲精品成人网站在线播放| 又黄又大又爽免费视频| 免费看男女下面日出水视频| 国产va免费精品观看精品 | 亚洲网站视频在线观看| 亚洲视频在线观看网址| 亚洲国产日韩在线| 亚洲久本草在线中文字幕| 中文字幕第13亚洲另类| 永久亚洲成a人片777777|