详解PostgreSQL提升批量数据导入性能的n种方法

 更新时间:2021年03月11日 09:11:52   作者:瀚高PG实验室  
这篇文章主要介绍了PostgreSQL提升批量数据导入性能的n种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

关键字:批量数据导入,数据加载,大量插入,加快,提升速度
多元化选择时代,人生里很多事物都是如此,凡事都没有一成不变的方式和方法。不管白猫黑猫,能抓老鼠的就是好猫,适合自己的就是最好的。
提升批量数据导入的方法亦是如此,没有何种方法是最优的,应用任何方法前根据自己的实际情况权衡利弊,做出选择。
批量导入数据之前,无论采取何种方式,务必做好相应的备份。
导入完成后亦需对相应对象进行ANALYZE操作,这样查询优化器才会按照最新的统计信息生成正确的执行计划。

下面正式介绍提升批量数据导入性能的n种方法。

方法1:禁用自动提交。

psql
\set AUTOCOMMIT off

其他
BEGIN;
执行批量数据导入
COMMIT;

方法2:设置表为UNLOGGED。

导入数据之前先把表改成UNLOGGED模式,导入完成后改回LOGGED模式。

ALTER TABLE tablename SET UNLOGGED;
执行批量数据导入
ALTER TABLE tablename LOGGED;

优点:
导入信息不记录WAL日志,极大减少io,提升导入速度。
缺点:
1.在replication环境下,表无法设置为UNLOGGED模式。
2.导入过程一旦出现停电死机等会导致数据库不能干净关库的情况,数据库中所有UNLOGGED表的数据将丢失。

方法3:重建索引。

导入数据之前先删除相关表上的索引,导入完成后重新创建之。

DROP INDEX indexname;
执行批量数据导入
CREATE INDEX ...;

查询表上索引定义的方法

select * from pg_indexes where tablename ='tablename' and schemaname = 'schemaname';

方法4:重建外键。

导入数据之前先删除相关表上的外键,导入完成后重新创建之。

ALTER TABLE ...
 DROP CONSTRAINT ... ;
执行批量数据导入
ALTER TABLE ...
 ADD CONSTRAINT ... 
 FOREIGN KEY ...
 REFERENCES ...; 

相关信息可查询pg_constraint。

方法5:停用触发器

导入数据之前先DISABLE掉相关表上的触发器,导入完成后重新ENABLE之。

ALTER TABLE tablename DISABLE TRIGGER ALL; 
执行批量数据导入
ALTER TABLE tablename ENABLE TRIGGER ALL;

相关信息可查询pg_trigger。

方法6:insert改copy

COPY针对批量数据加载进行了优化。

COPY ... FROM 'xxx';

方法7:单值insert改多值insert

减少sql解析的时间。

方法8:insert改PREPARE

通过使用PREPARE预备语句,降低解析消耗。

PREPARE fooplan (int, text, bool, numeric) AS
 INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);

方法9:修改参数

增大maintenance_work_mem,增大max_wal_size。

方法10:关闭归档模式,降低wal日志级别。

修改archive_mode参数控制归档开启和关闭。降低wal_level值为minimal来减少日志信息记录。
此法需要重启数据库,需要规划停机时间。此外如有replication备库,还需考虑对其影响。

到此这篇关于PostgreSQL提升批量数据导入性能的n种方法的文章就介绍到这了,更多相关PostgreSQL批量数据导入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PostgreSQL长事务与失效的索引查询浅析介绍

    PostgreSQL长事务与失效的索引查询浅析介绍

    pg中的长事务会影响表中垃圾回收,导致表的年龄增长无法freeze。能消耗事务的只有当执行了一些DML或者DDL操作后才能算是我们通常说的长事务。否则只能算是我们常说的长连接,当然长连接也有很多弊端,例如占用内存、cpu等资源
    2022-09-09
  • PostgreSQL树形结构的递归查询示例

    PostgreSQL树形结构的递归查询示例

    这篇文章主要给大家介绍了关于PostgreSQL树形结构的递归查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • PostgreSQL管理工具phpPgAdmin入门指南

    PostgreSQL管理工具phpPgAdmin入门指南

    phpPgAdmin是用PHP开发的一个基于web的PostgreSQL数据库管理工具。和MySql时代的PHPMyAdmin类似。本文介绍了phpPgAdmin安装和使用方法,需要的朋友可以参考下
    2014-03-03
  • postgresql IvorySQL新增命令及相关配置参数详解

    postgresql IvorySQL新增命令及相关配置参数详解

    这篇文章主要为大家介绍了postgresql IvorySQL新增命令及相关配置参数详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Postgresql主从异步流复制方案的深入探究

    Postgresql主从异步流复制方案的深入探究

    这篇文章主要给大家介绍了关于Postgresql主从异步流复制方案的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Postgresql具有一起的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • PostgreSQL查看带有绑定变量SQL的通用方法详解

    PostgreSQL查看带有绑定变量SQL的通用方法详解

    今天我们要探讨的是 custom执行计划和通用执行计划。这一技术在 Oracle中被称为绑定变量窥视。但 Postgresql中并没有这样的定义,更严格地说,Postgresql叫做custom执行计划和通用执行计划
    2022-09-09
  • PostgreSQL向数据库表中添加行数据的操作

    PostgreSQL向数据库表中添加行数据的操作

    这篇文章主要介绍了PostgreSQL向数据库表中添加行数据的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 基于pgrouting的路径规划处理方法

    基于pgrouting的路径规划处理方法

    这篇文章主要介绍了基于pgrouting的路径规划处理,根据pgrouting已经集成的Dijkstra算法来,结合postgresql数据库来处理最短路径,需要的朋友可以参考下
    2022-04-04
  • postgresql 计算两点距离的2种方法小结

    postgresql 计算两点距离的2种方法小结

    这篇文章主要介绍了postgresql 计算两点距离的2种方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql如何兼容MySQL if函数

    postgresql如何兼容MySQL if函数

    这篇文章主要介绍了postgresql如何兼容MySQL if函数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03

最新评论