<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

    常用鏈接

    統計

    IT技術鏈接

    保險相關

    友情鏈接

    基金知識

    生活相關

    最新評論

    Oracle全局索引和本地索引

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

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

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

    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.

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

    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

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

    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

    接下來再來看看本地分區。

    本地索引的分區和其對應的表分區數量相等,因此每個表分區都對應著相應的索引分區。使用本地索引,不需要指定分區范圍因為索引對于表而言是本地的,當本地索引創建時,Oracle會自動為表中的每個分區創建獨立的索引分區。

    創建本地索引不必顯式的指定maxvalue值,因為為表新添加表分區時,會自動添加相應的索引分區。

    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

    這里系統已經自動以和表分區相同的名字自動創建了一個索引分區。同理,刪除表分區時相對應的索引分區也自動被刪除。

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

    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,但索引分區的鍵值仍然和表的分區鍵值相同,即ord_date,也即是所謂的非前綴型索引。

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

    假設有一個使用DATE列分區的大表。我們經常使用一個VARCHAR2列(VCOL)進行查詢,但這個列并不是表的分區鍵值。

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

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

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

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

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

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

    主站蜘蛛池模板: 免费国产99久久久香蕉| 2015日韩永久免费视频播放| 香蕉成人免费看片视频app下载| 3344免费播放观看视频| 亚洲av色福利天堂| 久久国产精品免费看| 亚洲丁香色婷婷综合欲色啪| 欧洲人免费视频网站在线| 亚洲国产精品成人精品无码区| 亚洲免费观看视频| 亚洲精选在线观看| 亚洲免费视频观看| 亚洲综合在线一区二区三区 | 人妻18毛片a级毛片免费看| 四虎免费永久在线播放| 一级毛片a免费播放王色电影| 亚洲黄片手机免费观看| 好吊色永久免费视频大全| 亚洲精品色午夜无码专区日韩| 久久免费高清视频| 亚洲精品蜜夜内射| 中文字幕免费视频| 亚洲日日做天天做日日谢| 成年女人毛片免费播放视频m| 国产成人亚洲精品91专区高清| 亚洲日韩VA无码中文字幕| a毛看片免费观看视频| 亚洲色图古典武侠| 白白国产永久免费视频| 日韩大片免费观看视频播放| 亚洲高清专区日韩精品| 日韩在线免费视频| 日本黄页网址在线看免费不卡 | 两性色午夜视频免费网| 亚洲国产国产综合一区首页| 67194熟妇在线永久免费观看 | 在线观看日本亚洲一区| 国产精品亚洲产品一区二区三区| 久久狠狠躁免费观看| 亚洲狠狠色丁香婷婷综合| 久久精品国产精品亚洲人人|