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

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

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

    The important thing in life is to have a great aim , and the determination

    常用鏈接

    統(tǒng)計

    IT技術(shù)鏈接

    保險相關(guān)

    友情鏈接

    基金知識

    生活相關(guān)

    最新評論

    Oracle全局索引和本地索引

          Oracle數(shù)據(jù)庫中,有兩種類型的分區(qū)索引,全局索引和本地索引,其中本地索引又可以分為本地前綴索引和本地非前綴索引。下面就分別看看每種類型的索引各自的特點。

    全局索引以整個表的數(shù)據(jù)為對象建立索引,索引分區(qū)中的索引條目既可能是基于相同的鍵值但是來自不同的分區(qū),也可能是多個不同鍵值的組合。

    全局索引既允許索引分區(qū)的鍵值和表分區(qū)鍵值相同,也可以不相同。全局索引和表之間沒有直接的聯(lián)系,這一點和本地索引不同。

    SQL> create table orders (
         order_no      number,
         part_no       varchar2(40),
         ord_date      date
         )
         partition by range (ord_date)
          (partition Q1 values less than (TO_DATE('01-APR-1999','DD-MON-YYYY')),
           partition Q2 values less than (TO_DATE('01-JUL-1999','DD-MON-YYYY')),
           partition Q3 values less than (TO_DATE('01-OCT-1999','DD-MON-YYYY')),
           partition Q4 values less than (TO_DATE('01-JAN-2000','DD-MON-YYYY'))
          )
         ;

    Table created.

    SQL> create index orders_global_1_idx
         on orders(ord_date)
          global partition by range (ord_date)
           (partition GLOBAL1 values less than (TO_DATE('01-APR-1999','DD-MON-YYYY')),
            partition GLOBAL2 values less than (TO_DATE('01-JUL-1999','DD-MON-YYYY')),
            partition GLOBAL3 values less than (TO_DATE('01-OCT-1999','DD-MON-YYYY')),
            partition GLOBAL4 values less than (MAXVALUE)
           )
         ;

    Index created.

    SQL> create index orders_global_2_idx
         on orders(part_no)
          global partition by range (part_no)
           (partition IND1 values less than (555555),
            partition IND2 values less than (MAXVALUE)
           )
         ;

    Index created.

    從上面的語句可以看出,全局索引和表沒有直接的關(guān)聯(lián),必須顯式的指定maxvalue值。假如表中新加了分區(qū),不會在全局索引中自動增加新的分區(qū),必須手工添加相應(yīng)的分區(qū)。

    SQL> alter table orders add partition Q5 values less than (TO_DATE('01-APR-2000','DD-MON-YYYY'));

    Table altered.

    SQL> select TABLE_NAME, PARTITION_NAME from dba_tab_partitions where table_name='ORDERS';

    TABLE_NAME                     PARTITION_NAME
    ------------------------------ ------------------------------
    ORDERS                         Q1
    ORDERS                         Q2
    ORDERS                         Q3
    ORDERS                         Q4
    ORDERS                         Q5

    SQL> select INDEX_NAME, PARTITION_NAME from dba_ind_partitions where index_name=upper('orders_global_1_idx');

    INDEX_NAME                     PARTITION_NAME
    ------------------------------ ------------------------------
    ORDERS_GLOBAL_1_IDX            GLOBAL1
    ORDERS_GLOBAL_1_IDX            GLOBAL2
    ORDERS_GLOBAL_1_IDX            GLOBAL3
    ORDERS_GLOBAL_1_IDX            GLOBAL4

    使用全局索引,索引鍵值必須和分區(qū)鍵值相同,這就是所謂的前綴索引。Oracle不支持非前綴的全局分區(qū)索引,如果需要建立非前綴分區(qū)索引,索引必須建成本地索引。

    SQL> create index orders_global_2_idx
      2  on orders(part_no)
      3   global partition by range (order_no)
      4    (partition IND1 values less than (555555),
      5     partition IND2 values less than (MAXVALUE)
      6    )
      7  ;
     global partition by range (order_no)
                                        *
    ERROR at line 3:
    ORA-14038: GLOBAL partitioned index must be prefixed

    接下來再來看看本地分區(qū)。

    本地索引的分區(qū)和其對應(yīng)的表分區(qū)數(shù)量相等,因此每個表分區(qū)都對應(yīng)著相應(yīng)的索引分區(qū)。使用本地索引,不需要指定分區(qū)范圍因為索引對于表而言是本地的,當(dāng)本地索引創(chuàng)建時,Oracle會自動為表中的每個分區(qū)創(chuàng)建獨立的索引分區(qū)。

    創(chuàng)建本地索引不必顯式的指定maxvalue值,因為為表新添加表分區(qū)時,會自動添加相應(yīng)的索引分區(qū)。

    create index orders_local_1_idx
    on orders(ord_date)
     local
      (partition LOCAL1,
       partition LOCAL2,
       partition LOCAL3,
       partition LOCAL4
      )
    ;

    Index created.

    SQL> select INDEX_NAME, PARTITION_NAME from dba_ind_partitions where index_name=upper('orders_local_1_idx');

    INDEX_NAME                     PARTITION_NAME
    ------------------------------ ------------------------------
    ORDERS_LOCAL_1_IDX             LOCAL1
    ORDERS_LOCAL_1_IDX             LOCAL2
    ORDERS_LOCAL_1_IDX             LOCAL3
    ORDERS_LOCAL_1_IDX             LOCAL4

    SQL> alter table orders add partition Q5 values less than (TO_DATE('01-APR-2000','DD-MON-YYYY'));

    Table altered.

    SQL> select INDEX_NAME, PARTITION_NAME from dba_ind_partitions where index_name=upper('orders_local_1_idx');

    INDEX_NAME                     PARTITION_NAME
    ------------------------------ ------------------------------
    ORDERS_LOCAL_1_IDX             LOCAL1
    ORDERS_LOCAL_1_IDX             LOCAL2
    ORDERS_LOCAL_1_IDX             LOCAL3
    ORDERS_LOCAL_1_IDX             LOCAL4
    ORDERS_LOCAL_1_IDX             Q5

    這里系統(tǒng)已經(jīng)自動以和表分區(qū)相同的名字自動創(chuàng)建了一個索引分區(qū)。同理,刪除表分區(qū)時相對應(yīng)的索引分區(qū)也自動被刪除。

    本地索引和全局索引還有一個顯著的差別,就是上面提到的,本地索引可以創(chuàng)建成本地非前綴型,而全局索引只能是前綴型。

    SQL> create index orders_local_2_idx
         on orders(part_no)
          local
           (partition LOCAL1,
            partition LOCAL2,
            partition LOCAL3,
            partition LOCAL4)
         ;

    Index created.

    SQL> select INDEX_NAME, PARTITION_NAME, HIGH_VALUE from dba_ind_partitions
         where index_name=upper('orders_local_2_idx');

    INDEX_NAME                     PARTITION_NAME                 HIGH_VALUE
    ------------------------------ ------------------------------ ---------------------------------------------------------
    ORDERS_LOCAL_2_IDX             LOCAL1                         TO_DATE(' 1999-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS',
                                                                  'NLS_CALENDAR=GREGORIA'
    ORDERS_LOCAL_2_IDX             LOCAL2                         TO_DATE(' 1999-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS',
                                                                  'NLS_CALENDAR=GREGORIA'
    ORDERS_LOCAL_2_IDX             LOCAL3                         TO_DATE(' 1999-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS',
                                                                  'NLS_CALENDAR=GREGORIA'
    ORDERS_LOCAL_2_IDX             LOCAL4                         TO_DATE(' 2000-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS',
                                                                  'NLS_CALENDAR=GREGORIA'

    從上面的輸出可以看出,雖然索引的鍵值是part_no,但索引分區(qū)的鍵值仍然和表的分區(qū)鍵值相同,即ord_date,也即是所謂的非前綴型索引。

    最后,再引用一個例子說明前綴索引和非前綴索引的應(yīng)用。

    假設(shè)有一個使用DATE列分區(qū)的大表。我們經(jīng)常使用一個VARCHAR2列(VCOL)進(jìn)行查詢,但這個列并不是表的分區(qū)鍵值。

    有兩種可能的方法來訪問VCOL列的數(shù)據(jù),一是建立基于VCOL列的本地非前綴索引,

                   |                                         |
                 -------                                   -------
                |       |         (10 more                |        |
    Values:     A..     Z..   partitions here)            A..      Z..

    另一種是建立基于VCOL列的全局索引,

                    |                                         |
                  -------                                   -------
                 |       |         (10 more                |        |
    Values:      A..     D..   partitions here)            T..      Z..

    可以看出,如果能夠保證VCOL列值的唯一性,全局索引將會是最好的選擇。如果VCOL列值不唯一,就需要在本地非前綴索引的并行查詢和全局索引順序查詢以及高昂的維護(hù)代價之間做出選擇。

    posted on 2014-05-06 17:29 鴻雁 閱讀(234) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

    主站蜘蛛池模板: 操美女视频免费网站| 亚洲综合图色40p| 大地资源在线观看免费高清| 中文字幕天天躁日日躁狠狠躁免费| 日韩电影免费在线观看网址 | www.黄色免费网站| 韩国欧洲一级毛片免费 | 亚洲五月丁香综合视频| 91亚洲导航深夜福利| 亚洲AV无码国产丝袜在线观看 | 小草在线看片免费人成视久网| 国产在线国偷精品免费看| 久久免费观看国产精品88av| 国产成人精品久久免费动漫| 99在线在线视频免费视频观看| 黄+色+性+人免费| 国产特级淫片免费看| 久久亚洲国产欧洲精品一| 亚洲成a人片77777老司机| 亚洲人成人伊人成综合网无码 | 免费一级毛片不卡不收费| 国产亚洲精午夜久久久久久| 亚洲狠狠综合久久| 国产91成人精品亚洲精品| 99久久久国产精品免费牛牛四川| 欧美三级在线电影免费| 久久亚洲国产午夜精品理论片 | 成全视频在线观看免费高清动漫视频下载 | 久久久久免费精品国产| 亚洲综合精品网站| 免费一级毛片在线播放放视频| 久久久久久99av无码免费网站| 亚洲国产成人精品无码区在线网站| 久久精品国产免费一区| 亚洲成AV人片在线播放无码| 久久久精品视频免费观看| 日韩精品亚洲aⅴ在线影院| 一级做a毛片免费视频| 亚洲熟妇无码乱子AV电影| 中文字幕av无码不卡免费| 国产成A人亚洲精V品无码|