ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 三、分区表的管理

三、分区表的管理

原创 Linux操作系统 作者:linger_52102 时间:2011-03-18 18:10:11 0 删除 编辑


3.1 添加新的分区

添加新的分区有2中情况:

1)原分区里边界是maxvalue或者default 这种情况下,我们需要把边界分区drop掉,加上新分区后,在添加上新的分区。 或者采用split,对边界分区进行拆分。

2)没有边界分区的。 这种情况下,直接添加分区就可以了。

 

以边界分区添加新分区示例:

1)分区表和索引的信息如下:

SQL> create table custaddr

  2  (

  3    id         varchar2(15 byte)   not null,

  4    areacode   varchar2(4 byte)

  5  )

   partition by list (areacode)

  7  (

  8    partition t_list556 values ('556') tablespace icd_service,

  9    partition p_other values (default)tablespace icd_service

 10  );

表已创建。

SQL> create index ix_custaddr_id on custaddr(id)

  2  local (

  3    partition t_list556  tablespace icd_service,

  4    partition p_other tablespace icd_service

  5  );

索引已创建。

 

2)插入几条测试数据:

SQL> insert into custaddr values('1','556');

已创建 1 行。

SQL> insert into custaddr values('2','551');

已创建 1 行。

SQL> insert into custaddr values('3','555');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from custaddr;

ID              AREA

--------------- ----

1               556

2               551

3               555

SQL> select * from custaddr partition(t_list556);

ID              AREA

--------------- ----

1               556

SQL>

 

3)删除default分区

sql> alter table custaddr drop partition p_other;

表已更改。

sql> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';

table_name                     partition_name

------------------------------ ------------------------------

custaddr                       t_list556

 

4)添加新分区

SQL> alter table custaddr add partition t_list551 values('551') tablespace icd_service;

表已更改。

SQL> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';

 

TABLE_NAME                     PARTITION_NAME

------------------------------ ------------------------------

CUSTADDR                       T_LIST556

CUSTADDR                       T_LIST551

5)添加default 分区

SQL> alter table custaddr add partition p_other values (default)  tablespace icd_service;

表已更改。

SQL> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';

 

TABLE_NAME                     PARTITION_NAME

------------------------------ ------------------------------

CUSTADDR                       T_LIST556

CUSTADDR                       T_LIST551

CUSTADDR                       P_OTHER

 

6)对于局部索引,oracle会自动增加一个局部分区索引。验证一下:

sql> select owner,index_name,table_name,partitioning_type from dba_part_indexes where index_name='ix_custaddr_id';

owner            index_name           table_name

---------------------- ------------------------------ ------------------

icd             ix_custaddr_id         custaddr

sql> select index_owner,index_name,partition_name from dba_ind_partitions  where index_name='ix_custaddr_id';

index_owner           index_name                  partition_name

------------------------------ ------------------------------ ------------------

icd                  ix_custaddr_id                 p_other

icd                  ix_custaddr_id                 t_list551

icd                  ix_custaddr_id                 t_list556

 

分区索引自动创建了。

 

3.2  split 分区拆分

       3.1 中,我们说明了可以使用split的方式来添加分区。 这里我们用split方法继续上面的实验。

 

sql> alter table custaddr split partition p_other values('552') into (partition t_list552 tablespace icd_service, partition p_other tablespace icd_service);

表已更改。

--注意这里红色的地方,如果是Range类型的,使用atList使用Values

SQL> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';

TABLE_NAME                     PARTITION_NAME

------------------------------ ------------------------------

CUSTADDR                       T_LIST556

CUSTADDR                       T_LIST551

CUSTADDR                       T_LIST552

CUSTADDR                       P_OTHER

 

SQL> select index_owner,index_name,partition_name from dba_ind_partitions  where index_name='IX_CUSTADDR_ID';

 

index_owner             index_name                     partition_name

------------------------------ ------------------------------ ------------------

icd                            ix_custaddr_id                 p_other

icd                            ix_custaddr_id                 t_list551

icd                            ix_custaddr_id                 t_list552

icd                            ix_custaddr_id                 t_list556

 

注意:分区表会自动维护局部分区索引。全局索引会失效,需要进行rebuild

 

3.3 合并分区Merge

       相邻的分区可以merge为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区,原先的局部索引相应也会合并,全局索引会失效,需要rebuild

 

SQL> alter table custaddr merge partitions t_list552,p_other into partition p_other;

表已更改。

SQL> select index_owner,index_name,partition_name from dba_ind_partitions  where index_name='IX_CUSTADDR_ID';

index_owner       index_name         partition_name

--------------------  ------------------------------ ------------------

icd              ix_custaddr_id          p_other

icd              ix_custaddr_id          t_list551

icd              ix_custaddr_id          t_list556

 

SQL> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';

 

table_name                     partition_name

------------------------------ ------------------------------

custaddr                       t_list556

custaddr                       t_list551

custaddr                       p_other

 

3.4 . 移动分区

SQL> alter table custaddr move partition P_OTHER tablespace system;

 

表已更改。

SQL> alter table custaddr move partition P_OTHER tablespace icd_service;

表已更改。

 

注意:分区移动会自动维护局部分区索引,oracle不会自动维护全局索引,所以需要我们重新rebuild分区索引,具体需要rebuild哪些索引,可以通过dba_part_indexes,dba_ind_partitions去判断。

 

SQL> Select index_name,status From user_indexes Where table_name='CUSTADDR';

 

INDEX_NAME                     STATUS

------------------------------ --------

IX_CUSTADDR_ID                 N/A

 

      

3.5. Truncate分区

SQL> select * from custaddr partition(T_LIST556);

ID              AREA

--------------- ----

1               556

SQL> alter table custaddr truncate partition(T_LIST556);

表被截断。

SQL> select * from custaddr partition(T_LIST556);

未选定行

 

说明:

       Truncate相对delete操作很快,数据仓库中的大量数据的批量数据加载可能会有用到;截断分区同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建

 

3.6.  Drop分区

SQL> alter table custaddr drop partition T_LIST551;

表已更改。

 

SQL> select table_name,partition_name from user_tab_partitions where table_name='CUSTADDR';

TABLE_NAME                     PARTITION_NAME

------------------------------ ------------------------------

CUSTADDR                       T_LIST556

CUSTADDR                       P_OTHER     

同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15779287/viewspace-689888/,如需转载,请注明出处,否则将追究法律责任。

下一篇: hanganalyze
请登录后发表评论 登录
全部评论

注册时间:2009-10-03

  • 博文量
    50
  • 访问量
    208595