默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错——ORA-14402: 更新分区关键字列将导致分区的更改。但是可以通过打开表的row movement属性来允许对分区字段的update操作。
创新互联建站自2013年起,先为哈尔滨等服务建站,哈尔滨等地企业,进行企业商务咨询服务。为哈尔滨企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
例:创建分区表test_part进行实验
create table TEST_PART
(
A1 NUMBERnot null,
A2 DATE not null,
A3 VARCHAR2(6) not null,
A4 DATE not null,
A5 NUMBER not null,
)
partition by range (A1)
(
partition P1 values less than (1000),
partition P2 values less than (2000),
partition P3 values less than (3000),
partition P4 values less than (4000),
partition P5 values less than (5000),
partition P6 values less than (MAXVALUE)
);
插入如下的数据
SQL select * from test_part;
A1 A2 A3 A4 A5
---------- ----------- ------ ----------- ----------
123 2006-06-30 123456 2006-06-30 123
456 2006-06-30 asdfgh 2006-06-30 456
1 2006-06-30 234123 2006-06-30 1
2 2006-06-30 234234 2006-06-30 2
1234 2006-06-30 456789 2006-06-30 1234
1111 2006-06-30 ewrqwe 2006-06-30 1111
2222 2006-06-30 fdafda 2006-06-30 2222
3333 2006-06-30 342342 2006-06-30 3333
5678 2006-06-30 qwerty 2006-06-30 5678
9 rows selected
分区P1、P2的数据分别为:
SQL select rowid,t.* from test_part partition(p1) t;
ROWID A1 A2 A3 A4 A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLoAAGAAAtsEAAB 456 2006-06-30 asdfgh 2006-06-30 456
AAAGLoAAGAAAtsEAAC 1 2006-06-30 234123 2006-06-30 1
AAAGLoAAGAAAtsEAAD 2 2006-06-30 234234 2006-06-30 2
AAAGLoAAGAAAtsEAAE 123 2006-06-30 123456 2006-06-30 123
SQL select rowid,t.* from test_part partition(p2) t;
ROWID A1 A2 A3 A4 A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLwAAGAAA+8MAAC 1234 2006-06-30 456789 2006-06-30 1234
AAAGLwAAGAAA+8MAAD 1111 2006-06-30 ewrqwe 2006-06-30 1111
直接update提示错误
SQL update test_part set a1=1123 where a1=123;
update test_part set a1=1123 where a1=123
ORA-14402: 更新分区关键字列将导致分区的更改
打开row movement属性
SQL alter table test_part enable row movement;
Table altered
再次执行update操作
SQL update test_part set a1=1123 where a1=123;
1 row updated
执行是成功的并迁移到分区P2上了,且这时候rowid也发生了变化
SQL select rowid,t.* from test_part partition(p2) t;
ROWID A1 A2 A3 A4 A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLwAAGAAA+8MAAC 1234 2006-06-30 456789 2006-06-30 1234
AAAGLwAAGAAA+8MAAD 1111 2006-06-30 ewrqwe 2006-06-30 1111
AAAGLwAAGAAA+8PAAB 1123 2006-06-30 123456 2006-06-30 123
SQL
enable row movement可以允许数据段的压缩、update分区字段的数据(跨分区的)
SQL CREATE TABLE T_N (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (MAXVALUE));
表已创建。
SQL ALTER TABLE T_N EXCHANGE PARTITION P1 WITH TABLE T;
表已更改。
SQL alter table t_n split partition p1 at (TO_DATE('2005-7-1', 'YYYY-MM-DD')) into (partition p1,partition p2);
表已更改。
难道是这样?你说的利用分区交换只能这样了,虽然交换分区相当于修改数据字典,效率很高,但是分区的分割却相当于dml操作的。
=====================
原文中说的是:适用于包含大数据量的表转到分区表中的一个分区的操作。
看仔细咯,是大量数据转到分区表中的一个分区的操作,这样就不会涉及split操作,只需要修改数据字典,效率自然会很高。
Oracle11g有关分区的限制如下:
Partitions Maximum length of linear partitioning key 4 KB - overhead
Partitions Maximum number of columns in partition key 16 columns
Partitions Maximum number of partitions allowed per table or index 1024K - 1
一个表或索引最多支持1024*1024-1个分区
内存至少512M 交换分区至少1G
oracle软件安装位置1.3G
数据库安装位置至少1G
/tmp要有足够400M的剩余
如果这些目录都是隶属于根文件系统 那根需要有3G空闲才能安装 (1.3+1+0.4)
上述都属于最小要求 这是远远不够后期运行添加数据使用的.
并且随着后期运行oracle自身产生的文件会逐渐增大 请保留足够的空间需求
常用两种方法:
一种是使用create table as select方式创建一个分区表,然后将普通表重命名,然后对新的分区表创建所需索引,重命名等。
另外一种是在线重定义方式,调用DBMS_REDEFINITION这个包来实现,详情可百度学习下。
-------------------------------------------------------------------
个人推荐第一种,稳妥,速度也不错,嘿嘿!
有很多种方法可以做分区表转换,常见的有:
1、CTAS,在建分区表时就把源表数据插进去
2、建分区表,从源表导出,再导入分区表,10g可以用数据泵
3、在线重定义,不影响业务,但速度慢些
2亿数据如果按平均行长70也就是十几g,不会很慢,只要存储不太差,估计个把小时怎么也完事了。在线重定义比较慢,但一晚上也没问题,30g的搞过6,7个小时。
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款