如何更新oracle表中的分区字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何更新oracle表中的分区字段相关的知识,希望对你有一定的参考价值。
1、按时间分区表创建: 其中add_date_time为分区字段,每一年一个分区。插入100W数据。
2、增加一个分区,分两种情况:1.没有maxvalue分区。2.有maxvalue分区。
3、创建的分区就是没有maxValue的分区,没有maxvalue分区添加新分区。
4、有maxvalue分区添加新分区:有了maxvalue,就不能直接add partition,而是需要max分区split。
5、合并分区,相邻的分区可以merge为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区,原先的局部索引相应也会合并,全局索引会失效,需要rebuild。
参考技术A 默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错——ORA-14402: 更新分区关键字列将导致分区的更改。但是可以通过打开表的row movement属性来允许对分区字段的update操作。例:创建分区表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分区字段的数据(跨分区的)本回答被提问者采纳
oracle如何查询当前用户分区表的最大分区,最小分区和当前分区的数量
最大最小分区,分区数量,可以通过user_segments获得。因为每一个表分区都是一个segment,所以可以通过这个获得。
一般情况下,我们认为表中的bytes就是这个分区的大小。
user的视图中欧式当前用户的分区,通过table_name分组,paratition_name is not null 然后就可以求出最大分区和最小分区,count求出分区数量。追问
能把sql语句写来看看吗
追答我大概写一个,不过我这里没环境,没法测试啊,而且我也记不住segemnts表中的字段,只能是凭着记忆写,有些字段名可能找的不是那么准。
select b.table_name,b.paratition_name,(case when b.types=a.最大 then a.最大 when b.types=a.最小 then a.最小 end)最大最小空间,a.总数 from
(select table_name,max(type) 最大 ,min(type) 最小,count(*) 总数 from user_segments where partirion_name is not null group by table_name) a,
user_segments b where a.table_name=b.table_name and (b.types=a.最大 or b.types=a.最小)
不过似乎如果有子分区的话,这个语句就不能用了,所以子分区还要再来一层,因为一个子分区就是一个segments,而且子分区的字段好像是subpartition_name,和这个是不同的。
这是什么表,哪个字段表明了最大最小
追答max..
min..
看不懂吗
你确定?没有max…和min…
追答user_segments这里面也有
以上是关于如何更新oracle表中的分区字段的主要内容,如果未能解决你的问题,请参考以下文章
oracle 如何根据一个表中记录的变动更新另外一个表中相应的字段
高分求助:oracle 大表更新,大约200万,insert和update太慢,如何解决?