普通表到分区表转换
2016-06-25 20:28
295 查看
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.
步骤一:
[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'; --触发器//这个可以忽略[/b]
步骤二:[b]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)
)
[/b]
步骤三:
alter table [b][b]t1_temp[/b] nologging; --设置这主要是为了加快插入数据
[/b]
[b]rename t1 to old_t1; --修改老表的名称
[/b]
alter session enable parallel dml; --把session改为并行,[b][b]加快插入[/b][/b]
步骤四:
explain plan for insert /*+ append parallel(p,5) */ into [b][b]t1_temp[/b] p select /*+ parallel(n,10) */ * from[b]old_t1[/b] n;[/b]
insert /*+ append parallel(p,5) */ into [b][b][b]t1_temp[/b][/b]p select /*+ parallel(n,10) */ * from
[b][b]old_t1[/b][/b]n; --开始插入数据[/b]
步骤五:创建约束和索引
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; [b]--修改成老表的名称[/b]
方法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
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.
步骤一:
[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'; --触发器//这个可以忽略[/b]
步骤二:[b]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)
)
[/b]
步骤三:
alter table [b][b]t1_temp[/b] nologging; --设置这主要是为了加快插入数据
[/b]
[b]rename t1 to old_t1; --修改老表的名称
[/b]
alter session enable parallel dml; --把session改为并行,[b][b]加快插入[/b][/b]
步骤四:
explain plan for insert /*+ append parallel(p,5) */ into [b][b]t1_temp[/b] p select /*+ parallel(n,10) */ * from[b]old_t1[/b] n;[/b]
insert /*+ append parallel(p,5) */ into [b][b][b]t1_temp[/b][/b]p select /*+ parallel(n,10) */ * from
[b][b]old_t1[/b][/b]n; --开始插入数据[/b]
步骤五:创建约束和索引
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; [b]--修改成老表的名称[/b]
方法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
相关文章推荐
- 在 CentOS7 上安装 MongoDB
- AJAX之JSON
- Ubuntu下使用skynet笔记(1)
- 【Computing Geometry --计算几何】初级篇 <一>
- Mysql备份和恢复
- 在 CentOS7 上安装 MySQL5.7
- JAVA中的策略模式
- C# Lambda表达式
- 机房收费—日结报表
- CGRectGetHeight 等得作用
- leetcode.354. Russian Doll Envelopes
- js基础知识总结
- Hibernate的批量插入(&&JDBC)
- Sublime Text 3 Conclusion
- 在 CentOS7 上安装 Tomcat9
- Androidstudio安装genymotion插件
- eclipse不自动弹出提示(alt+/快捷键失效)
- windows下使用C++操作MySQL数据库
- 【课设】C++实现万年历
- TCP流量控制和拥塞控制