当前位置: 首页 > GoldenGate, Oracle, oracle 11g > 正文

快速增加分区和合并分区,分区数据自动维护

在测试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> /

表已创建。
  1. 分别向测试表test01的两个分区中插入数据。
SQL> insert into test01 part1 values(1,'stream');

已创建 1 行。
SQL> insert into test01 part2 values(2,'dbdream');

已创建 1 行。
SQL> commit;

提交完成。
  1. 查看数据分布。
SQL> select * from test01 partition(part1);

未选定行
SQL> select * from test01 partition(part2);

ID NAME
---------- ----------
1 stream
2 dbdream

数据并不是按照插入规则,每个分区一条,而是都插入了part2这个分区中。

  1. 增加一个分区。
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会自动为分区命名。

  1. 向新增分区中插入一条数据。
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分区。

  1. 再增加一个分区。
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
  1. 删掉一个分区,但是数据保留,也就是合并分区。
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分区之前数据分布一样。

  1. 再干掉一个分区。
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分区,这次没有变化。

  1. 再次干掉一个分区,现在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值的相似度选择分区存放,我测试的数据比较少,说服力也较小,这也只是我的猜测,欢迎有兴趣和研究过的人推翻。

本文固定链接: http://www.dbdream.com.cn/2013/05/%e5%bf%ab%e9%80%9f%e5%a2%9e%e5%8a%a0%e5%88%86%e5%8c%ba%e5%92%8c%e5%90%88%e5%b9%b6%e5%88%86%e5%8c%ba%ef%bc%8c%e5%88%86%e5%8c%ba%e6%95%b0%e6%8d%ae%e8%87%aa%e5%8a%a8%e7%bb%b4%e6%8a%a4/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2013年05月17日发表在 GoldenGate, Oracle, oracle 11g 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 快速增加分区和合并分区,分区数据自动维护 | 信春哥,系统稳,闭眼上线不回滚!
关键字:

快速增加分区和合并分区,分区数据自动维护:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter