oracle分区快速复制,有这样的一类需求,快速复制一张表,而这张表的数据量又非常的大。比方说本来是分区表,要把它重新变成非分区表,怎么能够快速的完成这样的操作呢?有下面几种方法: 第...

有这样的一类需求,快速复制一张表,而这张表的数据量又非常的大。比方说本来是分区表,要把它重新变成非分区表,怎么能够快速的完成这样的操作呢?有下面几种方法:

第一,就是利用CTAS方式来创建一张新表,当然要想加快速度,在数据库不是force logging的前提下,可以使用nologging方式来创建表:

SQL> select force_logging from v$database;

FOR

---

NO

SQL> create table tab_test_bak tablespace ts_test nologging as select * from tab_test;

Table created.

在建立完成表以后,要注意将表的属性重新变成logging:

SQL> select logging from tabs where table_name = 'TAB_TEST_BAK';

LOG

---

NO

SQL> alter table tab_test_bak logging;

Table altered.

CTAS的时候应该可以加PARALLEL参数的,或许会能提升点速度。如果表超大,则导成带分隔符的文本文件,用SQLLOAD,以DIRECT, PARALLEL 方式导入,我试过,这个速度是最快的。

如:

SQL> create table tab_test_bak parallel (n) nologging as select * from tab_test;

第二,就是利用CTAS方式来创建一张无数据新表:CREATE TABLE … AS SELECT .. WHERE 1=2; 然后使用 INSERT /*+ APPEND */ INTO .. SELECT …。最后将表名更改过来,建立一下新的索引,然后就可以了。

SQL> create table tab_test_bak2 tablespace ts_test nologging as select * from tab_test where 1=2;

Table created.

SQL> insert /* +append */ into tab_test_bak2 select * from tab_test;

12612000 rows created.

SQL> commit;

Commit complete.

SQL> drop table tab_test;

Table dropped.

SQL> rename tab_test_bak2 to tab_test;

Table renamed.

在force logging的情况下,sqlldr中的direct=y也是这起作用的。insert /*+ append */ 的时候如果采用并行的话,注意前面加上:alter session enable parallel dml;

第三,在原理上,它其实和第一种方式差不多,就是阻止数据库记录日志来加快速度,大概过程如下:

1、exp出原表(建议compress=n)

2、以nologging的方式,新建表结构和原表一样的空表

3、drop 原表,并rename新表为原表名

4、imp原表至空表中,注意要把ignore设置为y

5、更改新表的属性为logging

如:

D:\>exp 'sys/iamwangnc as sysdba' compress=n tables=tab_test file=d:\tab_test.dmp buffer=1024000

Export: Release 10.2.0.1.0 - Production on Sat Jun 7 20:30:09 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

Export done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set

server uses AL32UTF8 character set (possible charset conversion)

About to export specified tables via Conventional Path ...

. . exporting table                       TAB_TEST      12612000 rows exported

Export terminated successfully without warnings.

D:\>

SQL> create table tab_test_bak3 tablespace ts_test nologging as select * from tab_test where 1=2;

Table created.

SQL> drop table tab_test;

Table dropped.

SQL> rename tab_test_bak3 to tab_test;

Table renamed.

D:\>imp 'sys/iamwangnc as sysdba' ignore=y tables=tab_test file=d:\tab_test.dmp buffer=1024000

Import: Release 10.2.0.1.0 - Production on Sat Jun 7 20:37:25 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

Export file created by EXPORT:V10.02.01 via conventional path

import done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set

import server uses AL32UTF8 character set (possible charset conversion)

. importing SYS's objects into SYS

. importing SYS's objects into SYS

. . importing table                     "TAB_TEST"      12612000 rows imported

Import terminated successfully without warnings.

D:\>

SQL> alter table tab_test logging;

Table altered.

做了测试,第三种方式远远快于前两种方式,大概是其10倍的速度。注意以上三种方式都是在数据库没有force logging的前提下完成的。

如 果是10g的话,可以考虑用一下expdp和impdp。我最开始听说10g下的data pump的时候,就无数次的听到这样的观点:“data pump是用专用的api来实现,目的就是为了在10g中提供快的多的数据导入与导出,导出性能比在9i的direct模式下提到10-15倍,导入性能 能提到5倍”。

第四,用批量绑定结合分布commit的方式写存储过程转移,这么做有个好处就是可以降低对现有系统的影响,并且可以实时的知道转移的进度。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 为了将中的数据复制并插入到同一张中,你可以使用以下 SQL 语句: ``` INSERT INTO 名 (列1, 列2, …) SELECT 列1, 列2, … FROM 名 WHERE 条件; ``` 其中,`名`是你要插入数据的的名称,`列1, 列2, …`是你要插入的列的名称,`条件`是可选的,用于指定插入哪些行。 例如,如果你想将 `users` 中所有用户的信息复制并插入到同一张中,你可以使用以下语句: ``` INSERT INTO users (username, email, password) SELECT username, email, password FROM users; ``` 这样,你就可以将 `users` 中的所有数据复制并插入到同一张中。 ### 回答2: 要将一张的数据复制并插入到同一张中,可以使用如下的SQL语句: INSERT INTO 名 (字段1, 字段2, 字段3, ...) SELECT 字段1, 字段2, 字段3, ... FROM 名; 其中,"名"代操作的名称,"字段1, 字段2, 字段3, ..."代复制的字段的名称。 例如,假设要复制一个名为"学生成绩"的的所有数据并插入到同一张中,可以使用以下SQL语句: INSERT INTO 学生成绩 (学号, 姓名, 成绩) SELECT 学号, 姓名, 成绩 FROM 学生成绩; 这样就会将原中的所有数据复制并插入到同一张中,保持原有的字段结构和数据内容不变。 ### 回答3: 要复制一张的数据并插入同一张中,可以使用以下 SQL 语句: ``` INSERT INTO 名 (列1, 列2, 列3, ...) SELECT 列1, 列2, 列3, ... FROM 名 ``` 例如,假设有一张名为 `students` 的,有三个列分别为 `id`、`name` 和 `age`。现在要复制张表的数据并插入同一张中。 可以执行以下 SQL 语句: ``` INSERT INTO students (id, name, age) SELECT id, name, age FROM students ``` 该语句的含义是将 `students` 中的 `id`、`name` 和 `age` 列的数据复制并插入同一张 `students` 中。 执行这条 SQL 语句后,原中的数据将被复制并追加到末尾,变成的两倍。 这是一种常用的方式来快速复制中的数据,特别适用于需要批量生成数据或者创建备份的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值