读书人

Oracle分区目录-本地索引和全局索引比

发布时间: 2012-11-26 11:48:49 作者: rapoo

Oracle分区索引--本地索引和全局索引比较

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

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

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

SQL> select?index_name,table_name,partitioning_type,locality,ALIGNMENTfrom user_part_indexes;

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

二、全局索引特点:

1.????????全局索引的分区键和分区数和表的分区键和分区数可能都不相同,表和全局索引的分区机制不一样。

2.????????全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。

3.????????全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只截断一个分区中的数据,都需要rebulid若干个分区甚至是整个索引。

4.????????全局索引多应用于oltp系统中。

5.????????全局分区索引只按范围或者散列hash分区,hash分区是10g以后才支持。

6.????????oracle9i以后对分区表做move或者truncate的时可以用updateglobal indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。

7.????????表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引。

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

SQL> drop?index?i_id ;

Index?dropped

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

Index?created

SQL> alter table test drop partition p3;

Table altered

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

SQL> select?INDEX_NAME,PARTITION_NAME,STATUSfrom 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_globalon test(data) global
? 2? partition by range(id)
? 3? ( partition p1 values less than (2000) tablespace p1,
? 4??? partition p2 values less than (maxvalue) tablespacep2
? 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_globalon test(id) global
? 2? partition by range(id)
? 3? ( partition p1 values less than (2000) tablespace p1,
? 4??? partition p2 values less than (maxvalue) tablespacep2
? 5? );

create bitmap?index?i_id_globalon 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 可能无法与位图索引一起使用


<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

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

SQL> alter?index?i_id_globalrebuild online nologging;

alter?index?i_id_global rebuildonline nologging

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

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

SQL> select?index_name,partition_namefrom 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_globalrebuild partition p1 online nologging;

Index?altered

SQL> alter?index?i_id_globalrebuild partition p2 online nologging;

Index?altered

四、关于分区索引的几个视图
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

dba_ind_partitions 描述了每个分区索引的分区情况,以及统计信息
dba_part_indexes ? 分区索引的概要统计信息,可以得知每个表上有哪些分区索引,分区索引的类型(local/global)
dba_indexes minus dba_part_indexes (minus操作)可以得到每个表上有哪些非分区索引

读书人网 >其他数据库

热点推荐