oracle全局分区索引通常情况下,性能非常好。在分区粒度比较细的情况下,性能甚至高于本地前缀分区索引。
之所以叫全局分区索引,是因为该索引的分区与表的分区无关。
Oracle提供了两种全局分区索引,10g之前只有全局范围分区索引,而10g之后又提供了全局哈希分区索引。与表的范围分区和哈希分区一样,全局范围分区索引需要根据字段值进行分区,因此实施和管理难度高于oracle自动进行全局哈希分区索引。但用户可通过全局范围分区索引有效控制索引项的分布。全局哈希分区索引还特别适合于在大并发量和批量数据加载(insert)的情况下,特别是使用sequence时,避免索引数据出现热块。
一、 全局索引-范围索引
CREATE INDEX INX_FACT_GPRS_SGSN_CDR ON FACT_GPRS_SGSN_CDR(Msisdn,TIMEID)
compress global partition by range(Msisdn)
(PARTITION PART_20110815 VALUES LESS THAN (201108160000)
,
PARTITION PART_20110816 VALUES LESS THAN (201108170000)
,
PARTITION PART_max VALUES LESS THAN (maxvalue)
)
注:索引能分区吗?当然,全局分区-范围索引必须要指定第一个列(也即MSISDN)分区键,还必须要指定最大值。否则的话会报错。
一、 全局索引-哈希索引
CREATE INDEX INX_FACT_GPRS_SGSN_CDR ON FACT_GPRS_SGSN_CDR(Msisdn,TIMEID)
compress global partition by hash(Msisdn)
(PARTITION PART_1 ,
PARTITION PART_2
)
或
CREATE INDEX INX_FACT_GPRS_SGSN_CDR ON FACT_GPRS_SGSN_CDR(Msisdn,TIMEID)
compress global partition by hash(msisdn,timeid)
(PARTITION PART_1
,
PARTITION PART_2
)
注:哈希索引以上两种方式都可以,但是必须要把msisdn放在最前面。它也能添加分区的,如下:
SQL> alter index INX_FACT_GPRS_SGSN_CDR add partition part_3;
Index altered