快速增加分区和合并分区,分区数据自动维护
May172013
在测试HASH分区快速增加分区和合并分区时,遇到个很有意思的现象,就是分区表的数据自动维护,即使将数据插入到指定的分区也无效。
实验环境64位win7,ORACLE 11.2.0.1.0。以下是实验过程。
1.创建HASH分区的分区表。
SQL> create table test01(id number,name varchar2(10)) 2 partition by hash(name) 3 (partition part1, 4* partition part2) SQL> / 表已创建。
- 分别向测试表test01的两个分区中插入数据。
SQL> insert into test01 part1 values(1,'stream'); 已创建 1 行。 SQL> insert into test01 part2 values(2,'dbdream'); 已创建 1 行。 SQL> commit; 提交完成。
- 查看数据分布。
SQL> select * from test01 partition(part1); 未选定行 SQL> select * from test01 partition(part2); ID NAME ---------- ---------- 1 stream 2 dbdream
数据并不是按照插入规则,每个分区一条,而是都插入了part2这个分区中。
- 增加一个分区。
SQL> alter table test01 add partition; 表已更改。 SQL> select table_name,partition_name from user_TAB_PARTITIONS; TABLE_NAME PARTITION_NAME ------------------------------ ------------------------------ TEST01 PART1 TEST01 PART2 TEST01 SYS_P21 SQL> select * from test01 partition(part1); 未选定行 SQL> select * from test01 partition(part2); ID NAME ---------- ---------- 1 stream 2 dbdream SQL> select * from test01 partition(sys_p21); 未选定行
这种快速增加分区方式,ORACLE会自动为分区命名。
- 向新增分区中插入一条数据。
SQL> insert into test01 sys_p21 values (3,'streamsong'); 已创建 1 行。 SQL> commit; 提交完成。
查询数据分布。
SQL> select * from test01 partition(sys_p21); 未选定行 SQL> select * from test01 partition(part1); 未选定行 SQL> select * from test01 partition(part2); ID NAME ---------- ---------- 1 stream 2 dbdream 3 streamsong
数据还是插入到了part2这个分区,并没有插入到指定的sys_p21分区。
- 再增加一个分区。
SQL> alter table test01 add partition; 表已更改。 SQL> select table_name,partition_name from user_TAB_PARTITIONS; TABLE_NAME PARTITION_NAME ------------------------------ ------------------------------ TEST01 SYS_P22 TEST01 PART1 TEST01 SYS_P21 TEST01 PART2
向sys_p22分区中插入一条数据。
SQL> insert into test01 sys_p22 values(4,'432ew'); 已创建 1 行。 SQL> commit; 提交完成。
查询数据分布,奇怪的事又发生了,部分数据转移到了新增的分区。
SQL> select * from test01 partition(part2); ID NAME ---------- ---------- 3 streamsong SQL> select * from test01 partition(part1); 未选定行 SQL> select * from test01 partition(sys_p21); 未选定行 SQL> select * from test01 partition(sys_p22); ID NAME ---------- ---------- 1 stream 2 dbdream 4 432ew
- 删掉一个分区,但是数据保留,也就是合并分区。
SQL> alter table test01 coalesce partition; 表已更改。 SQL> select table_name,partition_name from user_TAB_PARTITIONS; TABLE_NAME PARTITION_NAME ------------------------------ ------------------------------ TEST01 PART1 TEST01 PART2 TEST01 SYS_P21
可见,最后增加的分区被干掉了,查询下数据分布。
SQL> select * from test01 partition(part1); 未选定行 SQL> select * from test01 partition(part2); ID NAME ---------- ---------- 3 streamsong 1 stream 2 dbdream 4 432ew SQL> select * from test01 partition(sys_p21); 未选定行
意料之中,数据又回到了part2这个分区,基本和没加sys_p22分区之前数据分布一样。
- 再干掉一个分区。
SQL> alter table test01 coalesce partition; 表已更改。 SQL> select table_name,partition_name from user_TAB_PARTITIONS; TABLE_NAME PARTITION_NAME ------------------------------ ------------------------------ TEST01 PART2 TEST01 PART1
查看数据分布,因为被干掉的分区中没有数据,理论上不会对数据分别有影响。
SQL> select * from test01 partition(part1); 未选定行 SQL> select * from test01 partition(part2); ID NAME ---------- ---------- 3 streamsong 1 stream 2 dbdream 4 432ew
事实证明也是这样,数据还都在part2分区,这次没有变化。
- 再次干掉一个分区,现在part1分区没有数据,part2分区有数据,哪个分区会被干掉呢?
SQL> alter table test01 coalesce partition; 表已更改。 SQL> select table_name,partition_name from user_TAB_PARTITIONS; TABLE_NAME PARTITION_NAME ------------------------------ ------------------------------ TEST01 PART1
part2分区被干掉了,那么毫无疑问,数据肯定都在part1分区了。
SQL> select * from test01 partition(part1); ID NAME ---------- ---------- 3 streamsong 1 stream 2 dbdream 4 432ew
通过这个简单的实验,基本可以说明在快速合并分区时,后建立的分区会被干掉。
HASH分区,数据分布是根据分区列数据的HASH值的相似度选择分区存放,我测试的数据比较少,说服力也较小,这也只是我的猜测,欢迎有兴趣和研究过的人推翻。