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

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

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

    Ordinary hut

    人間一福地,勝似天仙宮
    posts - 61, comments - 50, trackbacks - 0, articles - 1

    oracle的各種索引介紹

    Posted on 2009-08-11 16:51 landor 閱讀(2781) 評論(0)  編輯  收藏 所屬分類: oracle
    索引:
    最常用的索引包括:B*樹索引、位圖索引、位圖聯合索引、基于函數索引、應用域索引
    1 B*書索引:實現快速定位,數據庫會根據所索引的列來建立索引,如果該列是唯一的就將該列進行排序,然后建立索引,如果該列不唯一則加入rowid列,使其達到唯一,然后進行排序,借用oracle編程藝術中的圖:
     
    B*樹索引包括如下幾種:

            普通索引
            反向鍵索引:將索引列用reverse函數反序后建立索引,這是為了避免當同時插入數據太多,導致同一個索引塊忙碌的情況,比如同時插入1w個記錄,這1w個記錄就會同時在一個索引塊里創建索引,導致該塊忙碌,影響性能
            降序索引:索引默認是按照索引列遞增的順序進行排序的,如果索引列是遞減的也可以用默認的索引,畢竟倒過來就是遞減的;但是如果索引列有2個字段,而當我查詢的時候一個是asc,一個是desc,這時候默認索引到不到預期的效果;但是如果給遞減列用上降序索引,的增列用上默認索引的話,那么性能會大幅提高;
          關于聚簇因子:oracle有一個表叫user_indexes,在這里可以查詢所有的索引,比如執行查詢
         
          select a.index_name,b.num_rows,b.blocks,a.clustering_factor from user_indexes a, user_tables b
          where index_name in ('xx1','xx2'and a.table_name = b.table_name;
          其中clustering_factor:聚簇因子    index_name索引名   num_rows:行數   blocks:數據塊
          如果clustering_factor非常接近blocks,說明數據非常有序,連續的數據可能在一個塊中,這樣進行區間段等大數據查詢的時候,性能越高
          如果clustering_factor非常接近num_rows,說明數據非常隨即。索引條目指向的數據不一定在一個快中,進行區間等查詢的時候,性能很差

          B*樹索引應用場合:1 僅僅返回少數數據,數據重復度低;2 直接用索引能完成,沒有涉及到表(比如select count(x) where x='xx',這種語句直接檢索索引,根本接觸不到表本身,速度顯然很快)

    2 位圖索引:對于頻繁更新的表,不適合建立位圖索引;位圖索引會記錄該列的數據1存放在1,3,4,7...行,數據2存放在2,5,6...行,數據null存放在8,9...行等等,會把所有數據及其位置都記錄下來;
        所以,數據的重復度越高,越適合位圖索引;如何衡量呢,就是不同相數據的個數除以總行數越接近零越好;偽代碼:count(distinct(col))/count(*)越接近零,越適合做位圖索引;
        以上數據不應該建立B*樹索引,因為B*樹是樹形結構,而重復度高的數據,會根據一個值檢索到大量的數據。這違背了b*樹索引的原則。

        如果進行查詢select count(*) from Table1 where col1='x' or col1='y',這個就會用到位圖索引,只是將2個合并,都不會去查詢表,在索引中直接返回正確結果
        如果進行查詢select * from table1 wwhere col1='x' or col1='y',這個會用到位圖索引,oracle會到位圖索引去找到所有x和y的索引,然后找到相應的rowid,然后根據rowid快速返回結果集

        對于頻繁更新的表,為什么不適合用位圖索引:一個位圖索引中維護了一個數據和多個行的位置,如果一個會話修改了該列某一行的指定數據,比如xx1,那么該位圖索引所維護的xx1數據的所有行都會被鎖定;oracle是無法鎖定一個位圖索引中的某一個行的。這樣就會出現如下問題:
        如果該數據有100行,那么更新一行的時候,100行數據均被鎖定,導致其他會話只能等待期釋放之后才能操作;如果頻繁出現這種情況的話,性能會嚴重下降。

    3 位圖聯結索引:這是oracle9i所引入的一個索引;對于關聯表建立位圖索引,比如有一個部門表和員工表,員工表中存放了部門表的主鍵,此時想根據部門的name來查詢所有的員工,這是如果建立和位圖聯結索引,聚會很快得到結果集;

    4 基于函數的索引(待續)

    關于索引常見的問題:
    1 視圖能建立索引嗎:視圖引用的是基本表,只需要對基本表建立索引,就相當于在視圖中建立索引;
    2 Null和索引的協作:
        -- B*樹索引不能建立在都可以為null的列上,因為B*書索引會過濾掉null,也就是說,當進行查詢的時候:
        比如在col1和col2上建立了索引,col1和col2都可以為空,查詢select * from table1 where col1 is null 這個語句不會使用索引,因為如果使用索引的話,可能會丟失數據(那些null的數據會丟失);因為索引無法建立在都可以為null的列上,oracle優化器會選擇不使用索引,而是全表掃描;
    3 外鍵是否可以建立索引:在以下情況中,最好在外鍵上建索引
        a 如果經常進行聯機刪除或者修改父表主鍵的情況,建議在子表外鍵上建立索引。如果不建立索引的話,有上述操作時,oracle會把整個子表全部鎖死,這也是oracle出現死鎖的情況,嚴重影響系統性能;
        b 從父表查詢子表信息的時候,比如根據deptName查詢該部門下所有員工信息的時候,建議在子表外鍵上建立索引,或者建立位圖聯結索引,否則如果頻繁進行上述查詢的話,速度會很慢,因為每次都對員工表進行了全表掃描。

    4 索引為何失效
        a 關于B*樹索引,如果是a、b兩列建立索引,如果a、b兩列都允許為空的話,由于在全是null的數據上不會建立索引,所以為了避免查詢數據不準確,優化器會放棄使用索引,而是使用全表掃描;
        b 關于B*樹索引,如果是a、b兩列建立索引,如果這樣select * from table1 where b =5;此時如果a列的數據重復率不高的話,如果用索引的話,會去檢索每條索引的數據,這樣優化器更傾向于用全表掃描;如果a數據重復度很高,優化器會用一種跳躍式掃描方式,此時會用上索引;
        c 如果用到了函數,比如select * from table1 where f(a) = xx;此時不會用到索引,因為索引是建立在a上的,而不是建立在f(a)上的;
        d 如果a列是字符類型,但是我們執行了select * from table1 where a = 5;此時其實是隱式的應用了to_number(a)=5;索引是建立在a上,而不是建立在函數上的;
        e 有些時候oracle的優化器會智能的判斷使用索引后是否會提高效率,如果不會提高效率那么優化器會自動放棄索引,而執行full table;此時請檢查索引的合理性;
        oracle編程藝術上說:歸根結底,原因通常就是
            “不能使用索引,使用索引會返回不正確的結果”
            “不應該使用索引,使用了,性能會變得很糟糕”

    另外:如果是兩個列建立索引,那么哪個放前面,哪個放后面呢:
        這個要視情況而定,如果只有如下查詢select * from table1 where a= :x and b= :y,那么哪個在前面都無所謂;
        如果還有這種方式:select * from table1 where b = :y ,那么需要b列在前面;

        oracle編程藝術中還就索引壓縮做出對比,這里不記錄了。以上都是個人理解記錄,都是為了方便自己。

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲国产美女精品久久久久| 九九精品国产亚洲AV日韩| 一级特黄录像免费播放中文版| 成人免费淫片在线费观看| 亚洲三级在线观看| 亚洲精品黄色视频在线观看免费资源 | 成人亚洲性情网站WWW在线观看| 亚洲AV无码成人网站在线观看| 日本免费高清视频| 免费a级黄色毛片| 青青久久精品国产免费看| 亚洲国产成人久久精品99| av网站免费线看| 亚洲精品成人无限看| 久久成人免费电影| 亚洲精品在线不卡| 四虎影视久久久免费| 精品亚洲一区二区三区在线播放 | 黄页网址在线免费观看| 1000部禁片黄的免费看| 国产∨亚洲V天堂无码久久久| 黄色一级视频免费| 亚洲男人的天堂www| 亚洲视频免费播放| 亚洲色在线无码国产精品不卡| 1000部羞羞禁止免费观看视频| 久久狠狠爱亚洲综合影院| 免费国产美女爽到喷出水来视频| 一级黄色毛片免费看| 久久久久亚洲av无码专区| 在线观看免费为成年视频| 亚洲va乱码一区二区三区| 免费看美女被靠到爽| 亚洲人成网站在线播放2019 | 亚洲日韩精品射精日| 麻豆最新国产剧情AV原创免费 | 免费看又黄又无码的网站| 亚洲精品天堂在线观看| 亚洲一级片免费看| 久久不见久久见免费影院www日本| 久久精品国产亚洲AV无码偷窥|