zoukankan      html  css  js  c++  java
  • 分区索引

    本文基于oracle10gR2

    分区索引分为本地(local index)索引和全局索引(global index)。

    其中本地索引又可以分为有前缀(prefix)的索引和无前缀(nonprefix)的索引。而全局索引目前只支持有前缀的索引。B树索引和位图索引都可以分区,但是HASH索引不可以被分区。位图索引必须是本地索引。

    一:本地索引:创建了一个分区表后,如果需要在表上面创建索引,并且索引的分区机制和表的分区机制一样,那么这样的索引就叫做本地分区索引。本地索引是由ORACLE自动管理的,它分为有前缀的本地索引和无前缀的本地索引。什么叫有前缀的本地索引?有前缀的本地索引就是包含了分区键,并且将其作为引导列的索引。什么叫无前缀的本地索引?无前缀的本地索引就是没有将分区键的前导列作为索引的前导列的索引。下面举例说明:

    create table test (id number,data varchar2(100))
    partition by RANGE (id)
    (
    partition p1 values less than (1000) tablespace p1,
    partition p2 values less than (2000
    ) tablespace p2,
    partition p3 values less than (maxvalue) tablespace p3
    );

    create index i_id on test(id) local; 因为id是分区键,所以这样就创建了一个有前缀的本地索引。

    SQL> select dbms_metadata.get_ddl('INDEX','I_ID','ROBINSON') index_name FROM DUAL;  ------去掉了一些无用信息

    INDEX_NAME

     

    --------------------------------------------------------------------------------

     CREATE INDEX "ROBINSON"."I_ID" ON "ROBINSON"."TEST" ("ID") LOCAL

     (PARTITION "P1" TABLESPACE "P1" , PARTITION "P2" TABLESPACE "P2" ,PARTITION "P3" TABLESPACE "P3" );

    也可以这样创建:

    SQL> drop index i_id;

    Index dropped

    SQL> CREATE INDEX "ROBINSON"."I_ID" ON "ROBINSON"."TEST" ("ID") LOCAL
      2  (PARTITION "P1" TABLESPACE "P1" , PARTITION "P2" TABLESPACE "P2" ,PARTITION "P3" TABLESPACE "P3" );

    Index created

    create index i_data on test(data) local;因为data不是分区键,所以这样就创建了一个无前缀的本地索引。

    SQL> select dbms_metadata.get_ddl('INDEX','I_DATA','ROBINSON') index_name FROM DUAL; ---我删除了一些无用信息

    INDEX_NAME
    --------------------------------------------------------------------------------

     CREATE INDEX "ROBINSON"."I_DATA" ON "ROBINSON"."TEST" ("DATA") LOCAL
     (PARTITION "P1"  TABLESPACE "P1" ,PARTITION "P2"  TABLESPACE "P2" , PARTITION "P3" TABLESPACE "P3" );

    从user_part_indexes视图也可以证明刚才创建的索引,一个是有前缀的,一个是无前缀的

    SQL> select index_name,table_name,partitioning_type,locality,ALIGNMENT from user_part_indexes;

    INDEX_NAME                     TABLE_NAME                     PARTITIONING_TYPE LOCALITY ALIGNMENT
    ------------------------------ ------------------------------ ----------------- -------- ------------
    I_DATA                         TEST                           RANGE             LOCAL   
    NON_PREFIXED
    I_ID                           TEST                           RANGE             LOCAL    PREFIXED

    二:全局索引:与本地分区索引不同的是,全局分区索引的分区机制与表的分区机制不一样。全局分区索引全局分区索引只能是B树索引,到目前为止(10gR2),oracle只支持有前缀的全局索引。另外oracle不会自动的维护全局分区索引,当我们在对表的分区做修改之后,如果执行修改的语句不加上update global indexes的话,那么索引将不可用。以刚才创建的分区表test为例,讲解全局分区索引

    SQL> drop index i_id ;

    Index dropped

    SQL> create index i_id_global on test(id) global
      2  partition by range(id)
      3  ( partition p1 values less than (2000) tablespace p1,
      4    partition p2 values less than (maxvalue) tablespace p2
      5  );

    Index created

    SQL> alter table test drop partition p3;

    Table altered

    ORACLE默认不会自动维护全局分区索引,注意看status列,

    SQL> select INDEX_NAME,PARTITION_NAME,STATUS from user_ind_partitions where index_name='I_ID_GLOBAL';

    INDEX_NAME                     PARTITION_NAME                 STATUS
    ------------------------------ ------------------------------ --------
    I_ID_GLOBAL                    P1                             USABLE
    I_ID_GLOBAL                    P2                             USABLE

    SQL> create index i_id_global on test(data) global
      2  partition by range(id)
      3  ( partition p1 values less than (2000) tablespace p1,
      4    partition p2 values less than (maxvalue) tablespace p2
      5  );

    create index i_id_global on test(data) global
    partition by range(id)
    ( partition p1 values less than (2000) tablespace p1,
      partition p2 values less than (maxvalue) tablespace p2
    )

    ORA-14038: GLOBAL  分区索引必须加上前缀

    SQL> create bitmap index i_id_global on test(id) global
      2  partition by range(id)
      3  ( partition p1 values less than (2000) tablespace p1,
      4    partition p2 values less than (maxvalue) tablespace p2
      5  );

    create bitmap index i_id_global on test(id) global
    partition by range(id)
    ( partition p1 values less than (2000) tablespace p1,
      partition p2 values less than (maxvalue) tablespace p2
    )

    ORA-25113: GLOBAL 可能无法与位图索引一起使用

    三:分区索引不能够将其作为整体重建,必须对每个分区重建

    SQL> alter index i_id_global rebuild online nologging;

    alter index i_id_global rebuild online nologging

    ORA-14086: 不能将分区索引作为整体重建

    这个时候可以查询dba_ind_partitions,或者user_ind_partitions,找到partition_name,然后对每个分区重建

    SQL> select index_name,partition_name from user_ind_partitions where index_name='I_ID_GLOBAL';

    INDEX_NAME                     PARTITION_NAME
    ------------------------------ ------------------------------
    I_ID_GLOBAL                    P1
    I_ID_GLOBAL                    P2

    SQL> alter index i_id_global rebuild partition p1 online nologging;

    Index altered

    SQL> alter index i_id_global rebuild partition p2 online nologging;

    Index altered

    四:关于分区索引的几个视图

     dba_ind_partitions 描述了索引的分区情况,以及统计信息

    dba_part_indexes   描述了分区索引的情况,这个只是一个概要信息

  • 相关阅读:
    工程事故与现实世界(续)
    工程事故与现实世界
    直觉与概率
    有一种冲动:世界那么大
    人生的意义
    这些年来什么才是最好的投资?
    时间太少,如何阅读?
    程序员的成长法则与进阶攻略
    秘密:从程序员到领导者的微妙之处
    为什么加入付费社群?
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330620.html
Copyright © 2011-2022 走看看