Oracle快速执行大量insert语句

一:遇到的问题
最近在做数据库迁移的工作,其中有一些数据表数据量庞大,传统的insert语句批量执行,执行速度非常的缓慢。
二:解决思路
1.首先原库的一张表fj_date有6万多条数据;新库中的表名与它一样,但是没有数据。
2.其次要解决的问题是:使用DBLINK建立两库的连接,这一步有个问题就是当前用户没有创建DBLINK的权限,首先查看当前用户是否有权限:
SQL> select * from user_sys_privs where privilege like upper(‘%DATABASE LINK%’) AND USERNAME=‘SYSTEM’;
USERNAME PRIVILEGE ADMIN_OPTION


发现没有返回任何数据,没有权限,此时需要我们以dba的身份登录,然后赋予该用户创建DBLINK的权限:

SQL> grant create public database link to system;
Grant succeeded
再次查看权限:
SQL> select * from user_sys_privs where privilege like upper(‘%DATABASE LINK%’) AND USERNAME=‘SYSTEM’;
USERNAME PRIVILEGE ADMIN_OPTION


SYSTEM CREATE PUBLIC DATABASE LINK NO
此时就有了创建DBLINK的权限,下图是使用pl/sql developer工具创建DBLINK的方式: 在这里插入图片描述
3.然后需要做的就是在原库中编写sql,实现跨库的select——insert操作,具体sql如下所示:
insert /*+ append parallel nologging / into FJ_DATA@testlink1
select * from FJ_DATA t where extract(year from t.st_date)>2016
解释一下:
此条sql就是为了实现跨库,将原库中2016年以后的数据插入到新库的空表中。
/
+ append parallel nologging */ 解释如下:
append:在使用了append选项以后,insert数据会直接加到表的最后面,而不会在表的空闲块中插入数据。使用append会增加数据插入的速度,append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo,不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。
parallel:并行,强行启用并行度来执行当前SQL。这个在Oracle 9i之后的版本可以使用,之前的版本现在没有环境进行测试。也就是说,加上这个说明,可以强行启用Oracle的多线程处理功能。举例的话,就像电脑装了多核的CPU,但大多情况下都不会完全多核同时启用(2核以上的比较明显),使用parallel说明,就会多核同时工作,来提高效率。
nologging:此模式不是不记录日志,而是最小化日志产生的数量,通常在下列情况下使用NOLOGGING,nologing模式通常和append联合使用。
最终执行的时间如图所示,6万多条数据,执行时间3.987秒。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值