海量数据迁移之分区表批量insert性能改进

简介: 在平时的工作中接触到的分区表一般都比较大,而且分区也少则几十,多则几百,上千。 在数据迁移的时候,分区表的迁移更是块大骨头,因为数据量太大,而且有些分区表中还有一些lob字段,想直接通过sqlldr来迁移还是需要做一些额外的工作。

在平时的工作中接触到的分区表一般都比较大,而且分区也少则几十,多则几百,上千。
在数据迁移的时候,分区表的迁移更是块大骨头,因为数据量太大,而且有些分区表中还有一些lob字段,想直接通过sqlldr来迁移还是需要做一些额外的工作。
如果通过datapump分区导出数据,批量导入,也是一种思路,不过需要考虑好并发的进程。
通过oracle_datapump来做数据的导入,可能更为灵活,但是不是绝对的。最近就做了一些相关的数据导入测试,感触不少。

比如,目前我们需要导入的两个大表,一个是memo,一个是charge,分区都有200多个。
而且数据分布不是很均匀。有的分区可能数据要多很多。使用oracle_datapump抽取的时候,比如memo表有25G,如果按照100M为一个单位,那么就要生成250个dump 文件。每个dump文件中大概有50多万条数据,抽取的dump文件不是基于分区的。然后在目标库中以外部表的形式加载,然后使用insert来做数据插入,启用8个并行度。导入的时候速度就不是很理想。平均每个dump文件需要大约1~2分钟的时间,甚至更长。就算减少并行度,控制在4左右,速度还是没有什么变化。
本来冥思苦想的这个方案性能打了折扣,然后再一次尝试,限制生成的dump文件个数,比如memo表有25G,生成80个dump,这样每个dump文件就有将近300M左右。这样每个dump文件就大概由150万的数据。还是启用了同样的并行,速度就会快很多,一个dump文件大约在1~2分钟,dump的个数少了大半,时间就随之节省了很多。

基于这个问题,我的想法是dump在100M左右的时候,启用并行不会有什么大的起色,启用8个4个,应该和不启用并行效果是类似的。
如果dump文件大了很多,如果启用并行,就会有相应的进程能够合理的处理一部分数据。
同时,因为memo表是分区表,如果做insert插入的时候,一个insert会在每个分区上加一个锁,这样就是200个多锁,这个也是很消耗资源的。如果频繁的做插入,commit动作,就会不断的去加同样数量级的锁,无形中也快拖累加载速度。如果dump文件较大,还是会加同样的锁,但是会在一定程度上使得并行使用的更为充分。可能加锁的频率降低了,对系统的负载也会小很多。

如果想有较大的改进的话,我的个人想法就是通过分区级别导出数据,然后在数据插入的时候,也是基于分区导入,这样就可以同时做多个insert操作,而且每个insert只会锁定一个相应的分区。而且考虑加入并行,可能性会好很多。
按照这个思路,就没有严格意义上的大表了,我们都可以切分再切分。

目录
相关文章
|
3月前
|
SQL
在云数据仓库ADB中,可以使用UPDATE语句进行单表更新和多表关联更新。
在云数据仓库ADB中,可以使用UPDATE语句进行单表更新和多表关联更新。
79 2
|
3月前
|
SQL
在云数据仓库ADB中,可以使用UPDATE语句进行单表更新和多表关联更新
【1月更文挑战第11天】【1月更文挑战第54篇】在云数据仓库ADB中,可以使用UPDATE语句进行单表更新和多表关联更新
41 1
|
SQL 存储 监控
为什么我建议需要定期重建数据量大但是性能关键的表
为什么我建议需要定期重建数据量大但是性能关键的表
为什么我建议需要定期重建数据量大但是性能关键的表
|
存储 分布式计算 Cloud Native
Hologres揭秘:优化COPY,批量导入性能提升5倍+
揭秘Hologres优化COPY的技术原理,实现批量导入性能提升5倍+。
3701 0
Hologres揭秘:优化COPY,批量导入性能提升5倍+
|
SQL 存储 NoSQL
今天来聊聊怎么高效建表
在我们建表时,通常会给表附带属性,比如存储形式、生命周期TTL等,同时也会构建一些索引,以便查询的时候能够更加高效的得出查询结果。但是,不同的产品使用的编程语言又不一样,建表的语法可能也会有些差别,那今天小编就来为大家讲讲,怎么样在交互式分析中高效建表,(偷偷告诉你,看了这个文章,你的建表速度也会更...
1828 0
|
SQL 关系型数据库 测试技术
PostgreSQL pgbench tpcb 海量数据库测试 - 分区表测试优化
标签 PostgreSQL , pgbench , tpcb 背景 pgbench是PG的一款测试工具,内置的测试CASE为tpcb测试。同时支持用户自己写测试CASE。 大量自定义CASE参考 https://github.com/digoal/blog/blob/master/201711/readme.md 当我们使用tpcb测试CASE时,如果生成的数据量过于庞大,例如我最近在生成1万亿的CASE,可以考虑使用分区表,但是目前PG内置分区表的性能在分区非常多时,使用PREPARED STATEMENT会导致性能下降。
1847 0
|
关系型数据库 测试技术 数据库

热门文章

最新文章