<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ù)庫

    主站蜘蛛池模板: 亚洲日韩精品国产3区| 久久受www免费人成_看片中文| 亚洲国产精品久久人人爱| 亚洲精品国产电影| 四虎影院免费在线播放| 91免费国产精品| 老司机精品免费视频| 男男gay做爽爽免费视频| 亚洲一区欧洲一区| 久久亚洲AV成人无码国产| 亚洲乱码国产乱码精品精| 国产一区二区三区在线免费| 久久久久久久91精品免费观看| 三年片在线观看免费观看大全动漫 | 国产成人精品久久亚洲| 日韩伦理片电影在线免费观看| av免费不卡国产观看| 免费A级毛片在线播放| 免费国产叼嘿视频大全网站| 和老外3p爽粗大免费视频| 国产亚洲综合视频| 亚洲av日韩av永久无码电影 | 永久黄色免费网站| 59pao成国产成视频永久免费 | 久久精品九九亚洲精品天堂| 日韩亚洲变态另类中文| 国产成人精品曰本亚洲79ren| 亚洲精品国产自在久久| 亚洲精品高清在线| 亚洲综合另类小说色区| 国产亚洲AV手机在线观看 | 三年片在线观看免费西瓜视频| selaoban在线视频免费精品| 草久免费在线观看网站| 一级女性全黄久久生活片免费| 人妖系列免费网站观看| 国产三级在线免费观看| 99久久免费国产特黄| 最好免费观看高清在线| 99ee6热久久免费精品6| 国产四虎免费精品视频|