OpenGauss数据加载最佳实践

举报
jackcao 发表于 2022/09/30 09:58:27 2022/09/30
【摘要】 批量数据加载导致速度慢的原因,包括索引,触发器,外键,主键,WAL日志,主备数据同步等。本文总结了批量加载数据到OpenGauss数据库的最佳实践,在其他数据库迁移到OpenGauss数据库时仅供参考。表修改为无日志模式先把表修改为无日志模式,加载数据,再把表修改为有日志模式ALTER TABLE <target table> SET UNLOGGED<bulk data insert op...

批量数据加载导致速度慢的原因,包括索引,触发器,外键,主键,WAL日志,主备数据同步等。

本文总结了批量加载数据到OpenGauss数据库的最佳实践,在其他数据库迁移到OpenGauss数据库时仅供参考。

表修改为无日志模式

先把表修改为无日志模式,加载数据,再把表修改为有日志模式

ALTER TABLE <target table> SET UNLOGGED
<bulk data insert operations…>
ALTER TABLE <target table> LOGGED

修改为无日志模式,可以避免写WAL日志。

注意:无日志模式因为不写日志,如果数据库在加载数据异常关闭时,数据库重启会自动truncate没有日志的表。无日志的表数据也不会同步到备机,需要重新做数据同步。数据同步也会需要很长时间。

删除和重建索引

批量导入数据时,如果表上存在索引,在导入数据时,会同步更新索引信息。建议备份好表上的索引创建语句,删除索引,加载数据,然后重建索引。

DROP INDEX <index_name1>, <index_name2> … <index_name_n>
<bulk data insert operations…>
CREATE INDEX <index_name> ON <target_table>(column1, …,column n)

创建索引时,要调大maintenance_work_mem参数,以增加索引创建速度。

删除和重建外键

外键约束也影响数据加载性能。插入的每条记录,都要到对应的主键进行校验。数据库采用触发器的方式来做校验。

ALTER TABLE <target_table> 
    DROP CONSTRAINT <foreign_key_constraint>
 
BEGIN TRANSACTION
    <bulk data insert operations…>
COMMIT
 
ALTER TABLE <target_table> 
    ADD CONSTRAINT <foreign key constraint>  
    FOREIGN KEY (<foreign_key_field>) 
    REFERENCES <parent_table>(<primary key field>)...

重建外键时,调大maintenance_work_mem参数以提升外键创建速度。

禁用触发器

如果表上有插入的触发器,针对批量加载的每一条记录,触发器都会进行校验。推荐先禁用表上的触发器,插入数据,启用触发器。

ALTER TABLE <target table> DISABLE TRIGGER ALL
<bulk data insert operations…>
ALTER TABLE <target table> ENABLE TRIGGER ALL

使用copy命令

copyOpenGauss自带的性能最高的导入工具,比多值插入性能还高,支持导入二进制,支持带where条件导入。

COPY <target table> [( column1>, … , <column_n>)]
    FROM  '<file_name_and_path>' 
    WITH  (<option1>, <option2>, … , <option_n>)

copy工具其他优势:

  • 支持文本和二进制字段的导入
  • 本身支持事物
  • 允许指定输入文件的结构,例如导入那些字段
  • 通过where语句,支持导入满足条件的数据

如果OpenGauss主机配置比较高,可以启动多个copy命令进行并行数据导入。

注:以上代码片段为测试使用,商用时请考虑实际工程能力。

copy导入数据时的性能,也受表上索引,外键,触发器的影响。


使用多值插入

单条记录插入时,优化器会解析sql语句,约束校验,在一条语句中插入多条语句,可以只解析一次sql语句,提升性能。

INSERT INTO <target_table> (<column1>, <column2>, …, <column_n>) 
VALUES 
    (<value a>, <value b>, …, <value x>),
    (<value 1>, <value 2>, …, <value n>),
    (<value A>, <value B>, …, <value Z>),
    (<value i>, <value ii>, …, <value L>),
    ...

多值插入也受索引,外键,触发器的影响。建议删除和重建。

插入的数据,会导致内存中数据刷出,对其他sql查询性能有影响。

建议effective_cache_size参数设置为操作系统内存的50%shared_buffer设置为操作系统内存的25%1万条记录提交一次。

运行ANALYZE刷新表的统计信息

批量数据导入后,会导致系统中表的统计信息不准确,影响执行计划的选择。

建议表数据量变化超过10%时手工运行analyze命令,刷新表的统计信息。

参考文档:

http://ossc-db.github.io/pg_bulkload/index.html

https://www.enterprisedb.com/blog/7-best-practice-tips-postgresql-bulk-data-loading

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。