Welcome 微信登录

首页 / 数据库 / MySQL / Oracle创建分区索引总结

分区索引总结:一,分区索引分为2类:
1、global,它必定是Prefix的。不存在non-prefix的
2、local,它又分成2类:
 2.1、prefix:索引的第一个列等于表的分区列。
 2.2、non-prefix:索引的第一个列不等于表的分区列。 
LOCAL的索引只能是表的分区方式,不能自己写分区方式。他们是EQUI-Partition的。GLOBAL索引可以不分区,这个时候就是普通的一个索引。同一个列只能只有一个索引,这个列可以是GLOBAL或者是LOCAL的索引。如果唯一索引所在的列不是表的分区列,只能建立GLOBAL索引。例如:分区表
create table test (id number,data varchar2(100))
partition by RANGE (id)

partition p1 values less than (10000) ,
partition p2 values less than (20000) ,
partition p3 values less than (maxvalue)
);在ID列上创建一个LOCAL的索引
create index id_local on test(id) local;SQL> select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name="ID_LOCAL";INDEX_NAME                   PARTITION_NAME               HIGH_VALUE         STATUS
------------------------------ ------------------------------ -------------------- --------
ID_LOCAL                     P1                           10000                USABLE
ID_LOCAL                     P2                           20000                USABLE
ID_LOCAL                     P3                           MAXVALUE           USABLE
从上面可以看出索引的分区和表一样,即是EQUI-PARTITION如果我在表上增加个分区,则Oracle会自动维护分区的索引,注意此时加分区必须是用split,直接加会出错的。例如:
SQL> alter table test add partition p4 values less than (30000);
alter table test add partition p4 values less than (30000)
                             *
ERROR at line 1:
ORA-14074: partition bound must collate higher than that of the last partition
SQL> alter table test split partition p3 at (30000) into (partition p3, partition p4);Table altered.SQL> select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name="ID_LOCAL";INDEX_NAME                   PARTITION_NAME               HIGH_VALUE         STATUS
------------------------------ ------------------------------ -------------------- --------
ID_LOCAL                     P1                           10000                USABLE
ID_LOCAL                     P2                           20000                USABLE
ID_LOCAL                     P3                           30000                USABLE
ID_LOCAL                     P4                           MAXVALUE           USABLE SQL> select INDEX_NAME,INDEX_TYPE,TABLE_NAME from dba_indexes where index_name="ID_LOCAL";INDEX_NAME                   INDEX_TYPE                  TABLE_NAME
------------------------------ --------------------------- ------------------------------
ID_LOCAL                     NORMAL                      TEST
删除id_local索引
drop index id_local;重新在ID列上创建一个GLOBAL的索引
create index id_global on test(id) global;
SQL> select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name="ID_GLOBAL";no rows selectedSQL> select INDEX_NAME,INDEX_TYPE,TABLE_NAME from dba_indexes where index_name="ID_GLOBAL";INDEX_NAME                   INDEX_TYPE                  TABLE_NAME
------------------------------ --------------------------- ------------------------------
ID_GLOBAL                      NORMAL                      TEST
从上面可以看出,它此时是个普通索引。dba_ind_partitions里根本就没有记录。SQL>create index i_id_global on test(data) global
 partition by range(id)
 ( partition p1 values less than (10000) ,
   partition p2 values less than (MAXVALUE)
 );
 partition by range(id)
                        *
ERROR at line 2:
ORA-14038: GLOBAL partitioned index must be prefixed
此错误表示GLOBAL的索引必须是prefixed,即索引分区的列,必须是其基表的分区列。
SQL>create index id_global on test(id) global
 partition by range(id)
 ( partition p1 values less than (10000) ,
   partition p2 values less than (MAXVALUE)
 );Index created.
SQL> select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name="ID_GLOBAL";INDEX_NAME                   PARTITION_NAME               HIGH_VALUE         STATUS
------------------------------ ------------------------------ -------------------- --------
ID_GLOBAL                      P1                           10000                USABLE
ID_GLOBAL                      P2                           MAXVALUE           USABLESQL> select INDEX_NAME,INDEX_TYPE,TABLE_NAME from dba_indexes where index_name="ID_GLOBAL";INDEX_NAME                   INDEX_TYPE                  TABLE_NAME
------------------------------ --------------------------- ------------------------------
ID_GLOBAL                      NORMAL                      TEST从上面可以看出,它此时是个GLOBAL的索引了。dba_ind_partitions里有记录。请和上面的做个比较,加深印象。
  • 1
  • 2
  • 3
  • 下一页
PostgresQL中的NUlls first/last功能Group by字句的用法相关资讯      Oracle分区索引  Oracle创建索引  本文评论 查看全部评论 (1)
表情: 姓名: 字数


评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款