索引分区(二)


按区间对索引分区,即全局分区索引。索引按区间或散列分区,一个索引分区可能指向任何表分区。实际索引分区数可能不同于表分区数。
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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值