ORACLE PARTITIONED INDEX(二)
全局分区索引(GLOBAL PARTITIONED INDEXES)
全局分区索引是独立于它所依托的表的分区B树索引,一个单一的索引分区可以指向任意一个乃至所有的表分区,而本地分区索引则是一一对应的。
一般来说,全局索引应用于OLTP型数据库,有利于快速访问,数据整合和可用性。
在一个OLTP系统,一个表可能仅仅是按一个列进行分区,但是应用需要访问的是很多个不同的列,比如说employee表的分区列是department_id,但应用需要访问employee_id或者job_id。全局索引适用于这种场景。
例子:
--创建time_range_sales表,分区键是time_id CREATE TABLE time_range_sales ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE , channel_id CHAR(1) , promo_id NUMBER(6) , quantity_sold NUMBER(3) , amount_sold NUMBER(10,2) ) PARTITION BY RANGE (time_id) (PARTITION SALES_1998 VALUES LESS THAN (TO_DATE('01-JAN-1999','DD-MON-YYYY')), PARTITION SALES_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY')), PARTITION SALES_2000 VALUES LESS THAN (TO_DATE('01-JAN-2001','DD-MON-YYYY')), PARTITION SALES_2001 VALUES LESS THAN (MAXVALUE) ); --创建global partitioned index CREATE INDEX time_channel_sales_idx ON time_range_sales (channel_id) GLOBAL PARTITION BY RANGE (channel_id) (PARTITION p1 VALUES LESS THAN (3), PARTITION p2 VALUES LESS THAN (4), PARTITION p3 VALUES LESS THAN (MAXVALUE));
这里创建的全局分区索引的分区列跟基表的分区列是不一样的,因此,索引的分区列channel_id可能包含了基表的所有分区的数据。

分区表的部分索引化
这应该算是比较重要的概念了,部分索引化指的是你在创建索引的时候可以指定对哪一部分表进行索引化,通过设置分区表的indexing属性。
部分索引化的优势有:
1,只索引部分分区,可以节省很多不必要的索引存储空间
2,加载和查询的性能提升。在12C之前,进行交换分区的操作的时候,如果要使全局索引保持可用,需要对其进行物理更新。从12C开始,如果在进行任何分区维护操作的分区不是被索引化的分区,那么不需要对分区索引进行额外的操作
3,分成几部分对分区进行索引化,可以减小所需要的排序空间的大小
你可以把表的单独一个分区的indexing设置为on或者off。一个部分索引的本地分区索引对于没有开启indexing的所有表分区都没有有效的索引分区。而一个全局索引,无论是否分区,则会把那些indexing设置为off的所有分区的数据排除在外。
数据库不支持对那些强制唯一性约束的索引进行部分化索引。
下图显示的是部分索引化的全局索引,可以看到SALES_1998和SALES_2000的所有数据都被全局索引排除在外,尽管该全局索引的分区键是channel_id。

索引组织表的分区
索引组织表支持range,list以及hash分区,分区操作同样能够提高索引组织表的管理性,可用性和性能。另外,使用IOT的数据磁带盒同样可以对他们存储的数据进行分区(不太理解这句话)。
IOT的分区操作:
- 分区列必须是主键列的子集
- 第二个索引可以是本地化或者全局化的
- 溢出的数据段和表分区总是同等分区的
Oracle支持在IOT上创建分区/非分区的位图索引。只不过需要一个mapping table。
浙公网安备 33010602011771号