按区间对索引分区,即全局分区索引。索引按区间或散列分区,一个索引分区可能指向任何表分区。实际索引分区数可能不同于表分区数。
Oracle 支持两种全局分区索引(global partitioned index):范围(range)分区索引及哈希(hash)分区索引。
全局范围分区索引(global range partitioned index)的灵活性在于其分区度(degree of partitioning)及分区键(partitioning key )都可以和表的分区方法相独立。此类索引主要用于 OLTP 系统,在存取独立记录时效率较高。全局范围分区索引的最后一个分区必须使用 MAXVALUE 设置一个分区边界。这能保证所有表数据都能反映到索引中。全局前缀索引(global prefixed index)可以是唯一的或非唯一的。用户不能向全局范围分区索引中添加分区,因为最后一个分区总是以 MAXVALUE 作为分区边界。如果用户需要添加最高分区,应使用 ALTER INDEX SPLIT PARTITION 语句。如果一个全局索引的某分区已空,用户可以使用 ALTER INDEX DROP PARTITION 显示地将其移除。如果全局索引的某个分区内含有数据,移除此分区将导致下一个分区被标识为不可用。用户不能移除全局索引中的最后一个分区。
对于索引值单调增长的表,创建全局哈希分区索引(lobal hash partitioned index)有助于索引数据分布,从而提升系统性能。索引值单调增长指新索引数据只会在索引的右边界插入。
在一般情况下,对全局索引所在的堆表(heap-organized table)进行以下操作将导致索引被标识为不可用:
ADD (HASH)
COALESCE (HASH)
DROP
EXCHANGE
MERGE
MOVE
SPLIT
TRUNCATE
用户可以在上述操作的 SQL 语句后添加 UPDATE INDEXES 子句,以便维护全局分区索引。这样对索引进行维护的好处有两个:第一,在操作期间索引依然有效。因此其他应用程序不会受相关操作的影响。第二,在操作结束后索引不必重建。例如,ALTER TABLE DROP PARTITION P1 UPDATE INDEXES;(只有堆表支持此功能。)
全局非分区索引(global nonpartitioned index)与普通的非分区索引类似。此类索引主要用于 OLTP 系统,在存取独立记录时效率较高。
滑动窗口和索引
实现步骤涉及:
1、去除老数据,最旧的分区要么被去除,要么与一个空表交换,从而允许对旧数据进行归档
2、加载新数据并建立索引,将新数据加载到一个工作表中,建立索引并进行验证
3、关联新数据,一旦加载并处理了新数据,数据所在的表会与分区表中的一个空分区进行交换,将表中这些新数据变成分区表中的一个分区。
JEL@JEL >create table partitioned (timestamp date,id int) partition by range (timestamp)
2 (partition part_2004 values less than (to_date('2005/01/01','yyyy/MM/dd')) tablespace ts1,
3 partition part_2005 values less than (to_date('2006/01/01','yyyy/MM/dd')) tablespace ts2);
Table created.
JEL@JEL >insert into partitioned partition(part_2004) select to_date('2004/12/31','yyyy/MM/dd')-mod(rownum,360),object_id from all_objects;
9314 rows created.
JEL@JEL >insert into partitioned partition(part_2005) select to_date('2005/12/31','yyyy/MM/dd')-mod(rownum,360),object_id from all_objects;
9314 rows created.
JEL@JEL >commit;
Commit complete.
JEL@JEL >create index partitioned_idx_local on partitioned(id) local;
Index created.
JEL@JEL >create index partitioned_idx_global on partitioned(timestamp) global;
Index created.
接下来增加2006年的数据并删除2004年的数据
1、准备工作
JEL@JEL >create table part_2004 (timestamp date,id int);
Table created.
JEL@JEL >create index part_2004_idx on part_2004(id);
Index created.
JEL@JEL >create table part_2006 (timestamp date,id int);
Table created.
JEL@JEL >insert into part_2006 select to_date('2006/12/31','yyyy/MM/dd')-mod(rownum,360),object_id from all_objects;
9321 rows created.
JEL@JEL >create index part_2006_idx on part_2006(id) nologging;
Index created.
JEL@JEL >select SEGMENT_NAME,PARTITION_NAME,SEGMENT_TYPE from user_segments;
SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
------------------------------ ------------------------------ ------------------
PART_2006_IDX INDEX
PART_2006 TABLE
PART_2004_IDX INDEX
PART_2004 TABLE
PARTITIONED_IDX_GLOBAL INDEX
PARTITIONED_IDX_LOCAL PART_2004 INDEX PARTITION
PARTITIONED PART_2004 TABLE PARTITION
PARTITIONED_IDX_LOCAL PART_2005 INDEX PARTITION
PARTITIONED PART_2005 TABLE PARTITION
JEL@JEL >select index_name,status from user_indexes;
INDEX_NAME STATUS
------------------------------ --------
PARTITIONED_IDX_GLOBAL VALID
PARTITIONED_IDX_LOCAL N/A
PART_2004_IDX VALID
PART_2006_IDX VALID
索引全部可用
2、老化数据
JEL@JEL >alter table partitioned
2 exchange partition part_2004
3 with table part_2004
4 including indexes
5 without validation
6 update global indexes;
Table altered.
JEL@JEL >alter table partitioned
2 drop partition part_2004
3 update global indexes;
Table altered.
JEL@JEL >select index_name,status from user_indexes;
INDEX_NAME STATUS
------------------------------ --------
PARTITIONED_IDX_GLOBAL VALID
PARTITIONED_IDX_LOCAL N/A
PART_2004_IDX VALID
PART_2006_IDX VALID
JEL@JEL >select SEGMENT_NAME,PARTITION_NAME,SEGMENT_TYPE from user_segments;
SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
------------------------------ ------------------------------ ------------------
PART_2006_IDX INDEX
PART_2006 TABLE
PARTITIONED_IDX_GLOBAL INDEX
PART_2004_IDX INDEX
PART_2004 TABLE
PARTITIONED_IDX_LOCAL PART_2005 INDEX PARTITION
PARTITIONED PART_2005 TABLE PARTITION
7 rows selected.
JEL@JEL >select count(*) from PART_2004;
COUNT(*)
----------
9314
3、增加新数据
JEL@JEL >alter table partitioned add partition part_2006 values less than
2 (to_date('2007/01/01','yyyy/MM/dd'));
Table altered.
JEL@JEL >alter table partitioned
2 exchange partition part_2006
3 with table part_2006
4 including indexes
5 without validation
6 update global indexes;
Table altered.
JEL@JEL >select index_name,status from user_indexes;
INDEX_NAME STATUS
------------------------------ --------
PARTITIONED_IDX_GLOBAL VALID
PARTITIONED_IDX_LOCAL N/A
PART_2004_IDX VALID
PART_2006_IDX VALID
JEL@JEL >select SEGMENT_NAME,PARTITION_NAME,SEGMENT_TYPE from user_segments;
SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
------------------------------ ------------------------------ ------------------
PARTITIONED_IDX_LOCAL PART_2006 INDEX PARTITION
PARTITIONED PART_2006 TABLE PARTITION
PART_2006 TABLE
PART_2006_IDX INDEX
PARTITIONED_IDX_GLOBAL INDEX
PART_2004_IDX INDEX
PART_2004 TABLE
PARTITIONED_IDX_LOCAL PART_2005 INDEX PARTITION
PARTITIONED PART_2005 TABLE PARTITION
9 rows selected.
JEL@JEL >select count(*) from partitioned partition(PART_2006);
COUNT(*)
----------
9321
虽然update global indexes选项会使处理速度变慢,但不会出现停机状态。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29337971/viewspace-1065326/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29337971/viewspace-1065326/