普通表到分区表转换

本文详细介绍了四种将普通表转换为分区表的方法。方法A通过导出和导入数据实现;方法B涉及创建临时表,设置并行DML进行数据迁移,并重新创建索引和约束;方法C使用交换分区的方式转换;方法D则利用DBMS_REDEFINITION进行在线修改。每种方法都包括多个步骤,涉及表的重命名、数据迁移和索引重建等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A) 通过 Export/import 方法

B) 通过 Insert with a subquery 方法

C) 通过 Partition Exchange 方法

D) 通过 DBMS_REDEFINITION 方法


比如把test用户下的普通表t1转换成分区表

方法A.

步骤一: $exp test/a file=/backup/test_t1.dmp tables=t1


步骤二:SQL>drop table t1


步骤三:SQL>create table t1(a1 number,a2 varchar2(20)) partition by range (a1)(
partition part1 values less than (500000),
partition part2 values less than (maxvalue)
)


步骤四:$imp test/a file=/backup/test_t1.dmp ignore=y


方法B.

步骤一:

select NUM_ROWS,blocks,table_name,tablespace_name from user_tables where table_name='T1';
10000000         --一百万行

SELECT * FROM user_indexes where table_name='T1'; --查看表上的索引

select * from user_constraints where table_name='T1'; --约束

select * from user_triggers where table_name='T1'; --触发器//这个可以忽略


步骤二:SQL>create table t1_temp(a1 number,a2 varchar2(20)) partition by range (a1)(
partition part1 values less than (500000),
partition part2 values less than (maxvalue)
)


步骤三:

alter table t1_temp nologging;    --设置这主要是为了加快插入数据

rename t1 to old_t1;            --修改老表的名称

alter session enable parallel dml;  --把session改为并行,加快插入


步骤四:

explain plan for insert /*+ append parallel(p,5) */ into  t1_temp p select /*+ parallel(n,10) */ * fromold_t1 n;

insert /*+ append parallel(p,5) */ into t1_tempp select /*+ parallel(n,10) */ * from old_t1n; --开始插入数据


步骤五:创建约束和索引

alter index PK_T rename to PK_T_bak;

alter table T_old rename constraint PK_T to PK_T_bak;

create unique index idx_t on part_t(a1) local tablespace DBS nologging parallel 10;


步骤六:

alter table part_t logging noparallel;

alter index idx_t logging noparallel;

alter table t1+temp rename to t1; --修改成老表的名称


方法c.

SQL> create table t1_part(a1 number,a2 varchar2(20)) partition by range (a1)(
partition part1 values less than (500000),
partition part2 values less than (maxvalue)
)

Table created.

SQL> CREATE TABLE exchtab1 as SELECT * FROM t1 WHERE a1<500000;

Table created.

SQL> CREATE TABLE exchtab2 as SELECT * FROM t1 WHERE a1 >500000;

Table created.

SQL> alter table t1_part exchange partition part1 with table exchtab1;

Table altered.

SQL> alter table t1_part exchange partition part2 with table exchtab2;

Table altered.

给新表创建约束和索引(同上)


方法D. 在线修改

USING DBMS_REDEFINITION

MOS     文档 472449.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值