telephone 为空 唯一索引_【胜通】怪异ORA-01502(创建唯一约束却无唯一索引

本文介绍了在数据库中如何快速复制大量数据的表,并将其从分区表转换为非分区表的两种方法。一种是使用CTAS创建新表,通过nologging选项加速,之后再切换回logging状态;另一种是先导出、删除原表,然后以nologging方式重建并导入。测试显示第二种方法速度更快,约为第一种的10倍。注意这些方法在数据库未启用forcelogging的情况下有效。
摘要由CSDN通过智能技术生成

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

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

SQL> create table auction_auctions_bak

2  tablespace tbs_taobao

3  nologging

4  as

5  select * from auction_auctions;

Table created.

SQL> select count(*) from auction_auctions;

COUNT(*)

----------

4179779

SQL> select count(*) from auction_auctions_bak;

COUNT(*)

----------

4179779

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

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

LOG

---

NO

SQL> alter table auction_auctions_bak logging;

Table altered.

当然也可以这样:CREATE TABLE … AS SELECT .. WHERE 1=2;然后使用 INSERT /*+ APPEND */ INTO .. SELECT …。

最后将表名更改过来,建立一下新的索引,然后就可以了。

SQL> drop table auction_auctions;

Table dropped.

SQL> rename auction_auctions_bak to auction_auctions;

Table renamed.

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

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

2、drop 原表

3、以nologging的方式,新建与原表同名的空表

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

5、更改新表的属性为logging

我这次分别都对两种方式做了测试,结果第二种方式远远快于第一种方式,大概是其10倍的速度。注意以上两种方式都是在数据库没有force logging的前提下完成的。如果数据库被force logging了,那么怎样才能加快复制速度,这个大家可以说说。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值