分区表之split拆分分区实验


1.模拟环境

create table test

( seq  number not null,

  id int,

  constraint test_seq primary key(seq)

  )

  partition by range(seq)

  ( partition test_part1 values less than(10000) tablespace users,

    partition test_part2 values less than(20000) tablespace users,

    partition test_part3 values less than(30000) tablespace users,

    partition test_part4 values less than(40000) tablespace users,

    partition test_max values less than (maxvalue) tablespace users

  );

 

create sequence seq_test

 increment by 1000

 start with 1

 nomaxvalue

 nocycle

 nocache;

 

insert into test values(seq_test.nextval,1);

insert into test values(seq_test.nextval,2);

select * from test;

commit;

 

select * from dba_tab_partitions where table_name='TEST';

select count(*) from test partition(test_part1);

select count(*) from test partition(test_part2);

select count(*) from test partition(test_part3);

select count(*) from test partition(test_part4);

select count(*) from test partition(test_max);

 

 

----准备批量导入数据

begin

  for i in 3 .. 1000 loop

    insert into test values (seq_test.nextval, i);

  end loop;

  commit;

end;

 

 

SELECT COUNT(*) FROM test;

         1000

 

此时test_part1 10条数据

此时test_part2 10条数据

此时test_part3 10条数据

此时test_part4 10条数据

此时test_max 960条数据

 

如:

select * from test partition(test_part1);

1       1       1

2       1001         2

3       2001         3

4       3001         4

5       4001         5

6       5001         6

7       6001         7

8       7001         8

9       8001         9

10     9001         10

 

 

select min(seq) from test partition(test_max);

1       40001

select max(seq) from test partition(test_max);

1       999001

 

----截断分区1、2

alter table test truncate partition(test_part1);

alter table test truncate partition(test_part2);

 

 

2.开始工作(split 拆分分区)

----背景说明:  分区表中分区1和分区2没有数据,分区34max分区有数据,目前分区max数据太多。既然分区1和分区2已经没有数据,可以将分区1和分区2删除,删除后,再将max分区的数据拆分到新的分区5

 

----查看TEST表的分区情况

set linesize 999

set pagesize 999

col TABLE_NAME for a20

col PARTITION_NAME for a20

col HIGH_VALUE for a10

col TABLESPACE_NAME for a10

 

select  TABLE_NAME,PARTITION_NAME,HIGH_VALUE,HIGH_VALUE_LENGTH,TABLESPACE_NAME from dba_tab_partitions where TABLE_NAME='TEST';

TABLE_NAME      PARTITION_NAME       HIGH_VALUE HIGH_VALUE_LENGTH TABLESPACE

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

TEST                 TEST_MAX             MAXVALUE                   8 USERS

TEST                 TEST_PART1           10000                      5 USERS

TEST                 TEST_PART2           20000                      5 USERS

TEST                 TEST_PART3           30000                      5 USERS

TEST                 TEST_PART4           40000                      5 USERS

 

 

----因为有maxvalue区,直接添加分区是不成功的

SQL> alter table test add partition t_part5 values less than (50000);

alter table test add partition t_part5 values less than (50000)

                               *

ERROR at line 1:

ORA-14074: partition bound must collate higher than that of the last partition

 

----需要使用split拆分

SQL> alter table test split partition test_max at (50000) into (partition t_part5,partition test_max);

Table altered.

 

select  TABLE_NAME,PARTITION_NAME,HIGH_VALUE,HIGH_VALUE_LENGTH,TABLESPACE_NAME from dba_tab_partitions where TABLE_NAME='TEST';

 

TABLE_NAME           PARTITION_NAME       HIGH_VALUE HIGH_VALUE_LENGTH TABLESPACE

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

TEST                 TEST_MAX             MAXVALUE                   8 USERS

TEST                 TEST_PART1           10000                      5 USERS

TEST                 TEST_PART2           20000                      5 USERS

TEST                 TEST_PART3           30000                      5 USERS

TEST                 TEST_PART4           40000                      5 USERS

TEST                 T_PART5              50000                      5 USERS

6 rows selected.

 

SQL> select count(*) from test partition(t_part5);

  COUNT(*)

----------

        10

SQL> select count(*) from test partition(test_max);

  COUNT(*)

----------

       950

----此时max分区少了10条数据

 

 

----删除test_part1分区

SQL> alter table test drop partition test_part1;

Table altered.

 

----此时无法新插入数据,因为索引失效了,需要重建索引

SQL> insert into test values('102',100);

insert into test values('102',100)

*

ERROR at line 1:

ORA-01502: index 'SYS.TEST_SEQ' or partition of such index is in unusable state

 

----查看TEST表索引是否失效了

SQL>  select index_name,index_type,tablespace_name,table_type,status from user_indexes where table_name='TEST';

INDEX_NAME        INDEX_TYPE                  TABLESPACE  TABLE_TYPE  STATUS

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

TEST_SEQ               NORMAL            SYSTEM     TABLE       UNUSABLE

 

----重建索引

SQL> alter index TEST_SEQ rebuild online;

Index altered.

 

SQL>  select index_name,index_type,tablespace_name,table_type,status from user_indexes where table_name='TEST';

INDEX_NAME      INDEX_TYPE                  TABLESPACE   TABLE_TYPE  STATUS

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

TEST_SEQ          NORMAL                      SYSTEM     TABLE       VALID

 

 

----再次插入数据成功

SQL> insert into test values('102',100);

1 row created.

 

select  TABLE_NAME,PARTITION_NAME,HIGH_VALUE,HIGH_VALUE_LENGTH,TABLESPACE_NAME from dba_tab_partitions where TABLE_NAME='TEST';

TABLE_NAME   PARTITION_NAME       HIGH_VALUE HIGH_VALUE_LENGTH TABLESPACE

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

TEST                 TEST_MAX             MAXVALUE                   8 USERS

TEST                 TEST_PART2           20000                      5 USERS

TEST                 TEST_PART3           30000                      5 USERS

TEST                 TEST_PART4           40000                      5 USERS

TEST                 T_PART5              50000                      5 USERS

 

SQL> select count(*) from test partition(test_part2);

  COUNT(*)

----------

         1

 

----添加test_part1分区

----直接添加test_part1分区是失败的

SQL> alter table test add partition test_part1 values less than(10000) tablespace users;

alter table test add partition test_part1 values less than(10000) tablespace users

                               *

ERROR at line 1:

ORA-14074: partition bound must collate higher than that of the last partition

 

----需要使用split拆分分区方式添加test_part1分区

SQL> alter table test split partition test_part2 at (10000) into (partition test_part1,partition test_part2);

Table altered.

 

----使用拆分后,索引没有失效。这时test_part2分区的那条数据跑到了test_part1分区中

SQL> select * from test partition(test_part2);

no rows selected

 

SQL> select * from test partition(test_part1);

       SEQ         ID

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

       102        100

 

 

----查看分区表子分区所在表空间

select table_name,partition_name,tablespace_name from user_tab_partitions where table_name='TEST';

TABLE_NAME           PARTITION_NAME       TABLESPACE

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

TEST                 TEST_MAX             USERS

TEST                 TEST_PART1           USERS

TEST                 TEST_PART2           USERS

TEST                 TEST_PART3           USERS

TEST                 TEST_PART4           USERS

TEST                 T_PART5              USERS

6 rows selected.

 

SQL> select table_name,partition_name,tablespace_name from dba_tab_partitions where table_name='TEST' and table_owner='SYS';

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

转载于:http://blog.itpub.net/30130773/viewspace-2123156/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值