Postgres的大批量数据导入优化
主要分为如下几个方面
- 导入方式
- 表结构优化
- 并行
- 设置相关参数
- 利用pg_bulkload插件
导入方式
- 使用copy而不是insert可以有效的减少事务数量,进而加快导入
表结构优化
-
字段类型优化
尽量采用占用空间小的数据类型 -
表扩展方式优化
增大每次表扩展的大小 BLOCK_SIZE -
表分区
表进行物理分区可以减少IO等待 -
外键/索引
在导入时先禁用索引以及外键约束,导入后重新alter
并行
- 如果有多个表使用copy并行
- 对于单个表如果数据有序可以考虑分区多个copy并行导入分区
- 设置postgres并行参数,如max_parallel_workers等
参数优化
- 设置并行度
- 对于polarDB等提供了预读、预扩展的数据库,开启预读,预扩展功能
- 设置日志级别(可以修改源码强制禁用所有copy日志输出)
- 增大共享缓冲区
- 增大缓存
利用pg_bulkload插件
- pg_bulkload绕过了共享内存以及wal,直接从原文件读取数据到数据库
- 在20GB的TPCH测试中可以实现约10倍的性能提升
- 对于polarDB需要对pg_bulkload进行修改适配
其他
- 设置VACCUM频率
- 设置check_point
- … …
综合
- 结合多种优化方式可以获得更好的效果