oracle 中的PARTITION 分区

佳岳 2008-08-18 06:15:48
对存在的数据做PARTITION,情况是这样的,有一个表里面的数据是从其他服务器的DMP文件IMP导入,
现在的数据是已经存在的,想做PARTITION 处理。数据量有
COUNT(*)
----------
11695929
这么多,是2年的数据,想按月多分区处理
数据库是Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
...全文
418 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzlspb 2008-08-21
  • 打赏
  • 举报
回复
大概这样,先建一张结构一样我分区表,然把原表改名,再把分区表改成原表,写入数据,查看表数据是否正确,删除改名后的表(如:pm_tback)


大概这样操作:

create table tp1
(
....
sTime date
)
TABLESPACE 表空间名
PARTITION BY RANGE (sTime)
(
........

PARTITION PART_2008_04_01 VALUES LESS THAN (TO_DATE(' 2008-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION PART_2008_05_01 VALUES LESS THAN (TO_DATE(' 2008-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION PART_2008_06_01 VALUES LESS THAN (TO_DATE(' 2008-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION PART_2008_07_01 VALUES LESS THAN (TO_DATE(' 2008-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION PART_2008_08_01 VALUES LESS THAN (TO_DATE(' 2008-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
PARTITION PART_2008_09_01 VALUES LESS THAN (TO_DATE(' 2008-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
)
/


rename 原表 to bak_xxxx
/
rename tp1 to 原表
/
alter table 原表 nologging
/
alter session enable parallel dml
/
insert /*+ append */ into 原表 select * from bak_xxxx
/
CREATE INDEX IDX_xxxxxx_Time ON 原表 (STIME)
noLOGGING
local
TABLESPACE indx
/
commit
/
alter table 原表 logging;
liuyi8903 2008-08-20
  • 打赏
  • 举报
回复
如果不停应用在线重定义是一个比较好的方法。

但需要大量的空间。包括永久性和temp空间都要大。

佳岳 2008-08-19
  • 打赏
  • 举报
回复
exec dbms_redefinition.can_redef_table('jxc','jxc_art');

begin dbms_redefinition.can_redef_table('jxc','jxc_art'); end;

ORA-12089: cannot online redefine table "JXC"."JXC_ART" with no primary key
ORA-06512: at "SYS.DBMS_REDEFINITION", line 137
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1478
ORA-06512: at line 1
佳岳 2008-08-19
  • 打赏
  • 举报
回复
exec dbms_redefinition.can_redef_table('jxc','jxc_art');

begin dbms_redefinition.can_redef_table('jxc','jxc_art'); end;
佳岳 2008-08-19
  • 打赏
  • 举报
回复
begin DBMS_REDEFINITION.CAN_REDEF_TABLE('jxc_art'); end;

ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'CAN_REDEF_TABLE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

报错误
diaowf 2008-08-19
  • 打赏
  • 举报
回复
方法1:停应用,然后exp;rename table;创建分区表;imp进分区.
方法2:在线重定义(不需要停应用),下面是个例子.
create table test as select * from dba_users;
alter table TEST add primary key (USERNAME);
create index I_TEST on TEST (USER_ID);

CREATE TABLE TEST1 PARTITION BY RANGE(USER_ID)
(PARTITION P1 VALUES LESS THAN(20) TABLESPACE NNC_DATA01,
PARTITION P2 VALUES LESS THAN(40) TABLESPACE NNC_DATA02,
PARTITION P3 VALUES LESS THAN(MAXVALUE)TABLESPACE NNC_DATA03) enable row movement AS
SELECT * FROM TEST;
alter table TEST1 add primary key (USERNAME);
create index I_TEST1 on TEST (USER_ID);
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'TEST');
EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'TEST', 'TEST1');
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE(USER, 'TEST', 'TEST1');
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'TEST', 'TEST1');
drop table test1;
通过上面的方法就把test表进行了分区。
oracledbalgtu 2008-08-18
  • 打赏
  • 举报
回复
两个方法:
方法1:停应用,然后exp;rename table;创建分区表;imp进分区.
方法2:在线重定义(不需要停应用),下面是个例子.
create table test as select * from dba_users;
alter table TEST add primary key (USERNAME);
create index I_TEST on TEST (USER_ID);

CREATE TABLE TEST1 PARTITION BY RANGE(USER_ID)
(PARTITION P1 VALUES LESS THAN(20) TABLESPACE NNC_DATA01,
PARTITION P2 VALUES LESS THAN(40) TABLESPACE NNC_DATA02,
PARTITION P3 VALUES LESS THAN(MAXVALUE)TABLESPACE NNC_DATA03) enable row movement AS
SELECT * FROM TEST;
alter table TEST1 add primary key (USERNAME);
create index I_TEST1 on TEST (USER_ID);
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'TEST');
EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'TEST', 'TEST1');
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE(USER, 'TEST', 'TEST1');
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'TEST', 'TEST1');
drop table test1;
通过上面的方法就把test表进行了分区。

[Quote=引用楼主 xuejiayue1105 的帖子:]
对存在的数据做PARTITION,情况是这样的,有一个表里面的数据是从其他服务器的DMP文件IMP导入,
现在的数据是已经存在的,想做PARTITION 处理。数据量有
COUNT(*)
----------
11695929
这么多,是2年的数据,想按月多分区处理
数据库是Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
[/Quote]

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧