提高插入性能大规模(Improve insert performance massively)

2019-07-03 19:06发布

在我的应用程序需要大规模地提高插入性能。 例如:用约21K记录的文件接管100分钟来插入。 还有原因可能会需要一些时间,比如20分钟左右,但在100分钟实在太长了。

数据被插入到3个表(许多一对多)。 ID是由序列产生,但我已经用Google搜索,并设置hibernate.id.new_generator_mappings = true和allocationSize +顺序递增至1000。

另外的数据量是没有什么非凡可言,该文件是90 MB。

我已经与大部分的时间在JDBC驱动程序(PostgreSQL的)都花在和休眠的视觉VM验证。 我认为这个问题是关系到子表的唯一约束。 服务层使得插入之前手动检查(= SELECT)。 如果记录已经存在,它重新使用它,而不是等待约束的例外。

所以,概括起来为特定的文件会有每桌1将(可能是不同的,但不是这个文件,这是理想的(最快)的情况下)。 这意味着总60K插入+ 20K选择。 不过在100分钟似乎很长(是硬件计数,这是一个简单的PC用7200转硬盘,SSD没有或RAID上)。 然而,这是在以前的应用(纯JDBC),在其上该硬件的相同的插入了约15分钟的改进版本。 考虑到在这两种情况下,约4-5分钟花费在“前处理”的增加是巨大的。

谁这可以改善任何提示? 有没有批量加载功能?

Answer 1:

看到

弹簧数据的JPA:手动提交事务,并重新启动新的

加入entityManager.flush()entityManager.clear()每n次呼叫后保存()方法。 如果使用休眠添加hibernate.jdbc.batch_size=100这似乎是一个合理的选择。

业绩增长> 10倍,大概接近100倍。



Answer 2:

听起来像一个数据库的问题。 检查你的表,如果他们使用InnoDB或MyISAM数据,后者则是在我的经验与插入很慢,是新的DBS的默认。 删除外键你可以尽可能

如果您的问题真的是关系到一个单一的唯一索引的InnoDB可以做的伎俩。



文章来源: Improve insert performance massively