oracle海量数据插入探究

oracle海量数据插入探究:
–转载:https://mp.weixin.qq.com/s/d3XegSgatBSg88hhnYC5Lg
以下用一个实例证明研发对于数据库性能的巨大影响。

–使用交叉连接构造百万计表:
在这里插入图片描述
–创建同结构空表
在这里插入图片描述我们的目标是将ext_scan_objects的数据插入到另外一张空表中去。

第一种方法:常规插入

为了验证时间消耗,我们打开时间显示在这里插入图片描述
优点1:语法简单

优点2:对于小表、中表(数据量在千万级别左右或以下)较为合适,时间也快(本次约为83秒)

缺点1:数据量大的话,耗时长并且完成时间无法估测

致命缺点:如果数据量大到一定规模,大概率出现无法完成的情况,同时由于是一个事务一旦中途出现问题,会出现大事务长时间回滚,严重影响性能,并且重新开始,需要重新插入第一条数据

第二种方法:row by row +每行commit
在这里插入图片描述
缺点1:每次都提交事务,会影响性能,处理时间可能更长(本次实验过程耗时10分钟),但不至于出现因事务过大而出现的进退两难。

缺点2:可能因频繁提交事务带来的lgwr进程繁忙导致的性能问题

优势1:出现异常中断,可以通过辅助方法判断下一次插入的位置,减少工作量

优势2:由于中途有提交事务,可以观测到插入的速度,推断出完成所需要的大致时间

第三种方法:row by row + 分批commit
在这里插入图片描述
劣势1:虽然分多次提交,比方法二科学(处理时间有明显提高),但是由于仍是逐行处理,处理速度仍然没有上去
优势1:出现异常中断,可以通过辅助方法判断下一次插入的位置,减少工作量
优势2:可以观测到插入的速度,推断出完成所需要的大致时间

第四种方法:array方式
在这里插入图片描述
方法4不采用逐行处理,分批提交天然形成,速度大幅提升,建议使用

第五种方法:手动分拆,

insert into ext_scan_objects6 select * from ext_scan_objects where mod(object_id,5) = 0;

insert into ext_scan_objects6 select * from ext_scan_objects where mod(object_id,5) = 1;

insert into ext_scan_objects6 select * from ext_scan_objects where mod(object_id,5) = 2;

insert into ext_scan_objects6 select * from ext_scan_objects where mod(object_id,5) = 3;

insert into ext_scan_objects6 select * from ext_scan_objects where mod(object_id,5) = 4;

–一种较为"笨拙"的简单分拆方法,容易理解

–对于特大表毫无意义,并且消耗资源较多

第六种方法:set based:将要做的事情“囫囵”的告诉Oracle,该种方法性能较好
在这里插入图片描述
通过上面的实验证明,完成同样的任务,使用不同的方法,消耗的时间和资源都完全不一样。作为一个数据工作者,尤其是数仓工程师,相信这篇文章会给您带来一些启示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值