前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PostgreSQL数据库导入大量数据时如何优化

PostgreSQL数据库导入大量数据时如何优化

作者头像
程序猿DD
发布于 2022-08-29 06:13:10
发布于 2022-08-29 06:13:10
1.6K00
代码可运行
举报
文章被收录于专栏:程序猿DD程序猿DD
运行总次数:0
代码可运行

来源 | OSCHINA 社区、作者 | PostgreSQLChina

链接:https://my.oschina.net/postgresqlchina/blog/5568852

在使用 PostgreSQL 的时候,我们某些时候会往库里插入大量数据,例如,导入测试数据,导入业务数据等等。本篇文章介绍了在导入大量数据时的一些可供选择的优化手段。可以结合自己的情况进行选择。

一、关闭自动提交

关闭自动提交,并且只在每次 (数据拷贝) 结束的时候做一次提交。

如果允许每个插入都独立地提交,那么 PostgreSQL 会为所增加的每行记录做大量的处理。而且在一个事务里完成所有插入的动作的最大的好处就是,如果有一条记录插入失败, 那么,到该点为止的所有已插入记录都将被回滚,这样就不会面对只有部分数据,数据不完整的问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=#  \echo :AUTOCOMMITonpostgres=# \set AUTOCOMMIT offpostgres=#  \echo :AUTOCOMMIToff

二、导入阶段不创建索引,或者导入阶段删除索引

如果你正导入一张表的数据,最快的方法是创建表,用 COPY 批量导入,然后创建表需要的索引。在已存在数据的表上创建索引要比递增地更新表的每一行记录要快。

如果你对现有表增加大量的数据,可以先删除索引,导入表的数据,然后重新创建索引。当然,在缺少索引的期间,其它数据库用户的数据库性能将有负面的影响。并且我们在删除唯一索引之前还需要仔细考虑清楚,因为唯一约束提供的错误检查在缺少索引的时候会消失。(慎重考虑索引带来的影响)

三、删除外键约束

和索引一样,整体地检查外键约束比检查递增的数据行更高效。所以我们也可以删除外键约束,导入表地数据,然后重建约束会更高效。

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。

四、增大 maintenance_work_mem

在装载大量的数据的时候,临时增大 maintenance_work_mem 可以改进性能。这个参数也可以帮助加速 CREATE INDEX 和 ALTER TABLE ADD FOREIGN KEY 命令。它不会对 COPY 本身有很大作用,但是它可以加速创建索引和外键约束。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# show maintenance_work_mem; maintenance_work_mem---------------------- 64MB(1 row)

五、单值 insert 改多值 insert

减少 SQL 解析的时间。

六、关闭归档模式并降低 wal 日志级别

当使用 WAL 归档或流复制向一个安装中录入大量数据时,在导入数据结束时,执行一次新的 basebackup 比执行一次增量 WAL 更快。

为了防止录入时的增量 WAL,可以将 wal_level 暂时调整为 minimal, archive_modet 关闭,max_wal_senders 设置为 0 来禁用归档和流复制。但需修改这些设置需要重启服务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# show wal_level; wal_level----------- minimal(1 row)
postgres=# show  archive_mode; archive_mode-------------- off(1 row)
postgres=# show max_wal_senders; max_wal_senders----------------- 0(1 row)

七、增大 max_wal_size

临时增大 max_wal_size 配置变量也可以让大量数据载入更快。这是因为向 PostgreSQL 中载入大量的数据将导致检查点的发生比平常(由 checkpoint_timeout 配置变量指定)更频繁。

发生检查点时,所有脏页都必须被刷写到磁盘上。通过在批量数据载入时临时增加 max_wal_size,减少检查点的数目。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
postgres=# show max_wal_size; max_wal_size-------------- 1GB(1 row)

八、使用 copy 替代 insert

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

COPY 命令是为装载数量巨大的数据行优化过的;它没 INSERT 那么灵活,但是在大量装载数据的情况下,导致的荷载也少很多。因为 COPY 是单条命令,因此填充表的时候就没有必要关闭自动提交了。

如果不能使用 COPY,可以使用 PREPARE 来创建一个预备 INSERT,然后使用 EXECUTE 多次效率更高。这样就避免了重复分析和规划 INSERT 的开销。

九、禁用触发器

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE tab_1 DISABLE TRIGGER ALL;导入数据ALTER TABLE tab_1 ENABLE TRIGGER ALL;

十、相关导数工具:pg_bulkload

pg_bulkload 是 PostgreSQL 的一个高速数据加载工具,相对于 copy 命令。最大的优势是速度。在 pg_bulkload 的直接模式下,它将跳过共享缓冲区和 WAL 缓冲区,直接写入文件。它还包括数据恢复功能,可在导入失败时进行恢复。

地址:https://github.com/ossc-db/pg_bulkload

十一、导入数据后,使用 analyze

运行 ANALYZE 或者 VACUUM ANALYZE 可以保证规划器有表数据的最新统计。

如果没有统计数据或者统计数据太陈旧,那么规划器可能选择性能很差的执行计划,导致表的查询性能较差。

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取

推荐阅读

··································

你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

点击领取2022最新10000T学习资料

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿DD 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从零开始学PostgreSQL (十二):高效批量写入数据库
当需要在PostgreSQL数据库中大规模填充数据时,采用正确的策略至关重要。以下是提高数据加载效率的九个关键步骤:
DBA实战
2024/09/06
5470
从零开始学PostgreSQL (十二):高效批量写入数据库
pg 13批量插入最佳实践
背景:最近需要以编程方式将一千万条经纬数据记录插入到postgres数据库,最后通过一系列的实验验证,摸索出一些实践经验。
DB之路
2021/03/04
1.3K0
POSTGRESQL MYSQL MONGODB 配置文件总结(感谢我的三个DBA)
最近在整理POSTGRESQL MYSQL MONGODB REDIS 的标准化模板配置参数,当然这里面还包含 LINUX 的一些基本配置. 相关的整理的工作是我的三个 DBA 操作的, 针对目前的参数进行了相关的整理和重新设定. 昨天有人问我要,这边进贴出来,如果大家有什么问题 ,告诉我们, 大家一起进步.
AustinDatabases
2021/02/26
7720
PostgreSQL统计信息的几个重要视图
比如tup_returned值明显大于tup_fetched,历史SQL语句很多是全表扫描,存在没有使用索引的SQL,可结合pg_stat_statments查找慢SQL,也可结合pg_stat_user_table找全表扫描次数和行数最多的表;
yzsDBA
2020/10/29
1.3K0
从零开始学PostgreSQL (九):任务进度报告
PostgreSQL 提供了一系列的工具和视图来帮助数据库管理员监控各种维护任务的进度。
DBA实战
2024/09/06
1110
从零开始学PostgreSQL (九):任务进度报告
进阶数据库系列(二十三):PostgreSQL 性能优化
PostgreSQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。例如:
民工哥
2023/08/22
3.8K0
进阶数据库系列(二十三):PostgreSQL 性能优化
聊聊PostgreSQL的Replication
CAP理论 consistency:在整个集群角度来看,每个节点是看到的数据一致的;不能出现集群中节点出现数据不一致的问题 vailability:集群中节点,只有有一个节点能提供服务 partitioning:集群中的节点之间网络出现问题,造成集群中一部分节点和另外一部分节点互相无法访问 基本术语 Master节点:提供数据写的服务节点 Standby节点:根据主节点(master节点)数据更改,这些更改同步到另外一个节点(standby节点) Warm Standby节点:可以提升为master节点的s
用户4700054
2022/08/17
1.5K0
聊聊PostgreSQL的Replication
PostgreSQL技术大讲堂 - 第32讲:数据库参数调整
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
用户5892232
2023/11/03
3980
PostgreSQL技术大讲堂 - 第32讲:数据库参数调整
史上最全PostgreSQL体系结构
墨墨导读:本文主要从日志文件、参数文件、控制文件、数据文件、redo日志(WAL)、后台进程这六个方面来讨论PostgreSQL的结构。
数据和云
2019/07/22
4K0
史上最全PostgreSQL体系结构
Postgresql主从复制--物理复制
PostgreSQL支持物理复制(流复制)及逻辑复制2种。通过流复制技术,可以从实例级复制出一个与主库一模一样的实例级的从库。流复制同步方式有同步、异步两种。
俊才
2019/09/26
6.8K0
docker 部署 postgresql的主从数据库
docker exec -it -u postgres pgsslave /bin/bash
liuyunshengsir
2021/09/17
1.9K0
PostgreSQL数据库体系架构
PostgreSQL数据库的进程可以分为三类:后台进程、后端进程或叫服务器进程、客户端进程或用户进程。
用户8006012
2022/06/10
4.3K1
从零开始学PostgreSQL (二): 配置文件
PostgreSQL 使用三个主要的配置文件来控制服务器的行为、网络访问和用户映射。下面是对这三个文件的详细介绍:
DBA实战
2024/09/06
4640
从零开始学PostgreSQL (二): 配置文件
PostgreSQL主从复制--逻辑复制
逻辑复制是基于逻辑解析,其核心原理是逻辑主库将Publication中表的WAL日志解析成一定格式并发送给逻辑备库,逻辑备库Subscription接收到解析后的WAL日志后进行重做,从而实现表数据同步。
俊才
2019/10/14
4.5K0
PostgreSQL主从复制--逻辑复制
PostgreSQL 来自欧罗巴Patroni Patroni 管理下的POSTGRESQL 怎么修改参数 7
目前Patroni 系列已经更新到了7 , 本次的重点在于看如何在Patroni的管理下,修改系统的配置参数.
AustinDatabases
2020/11/25
1.4K0
PostgreSQL  来自欧罗巴Patroni   Patroni 管理下的POSTGRESQL 怎么修改参数  7
PostgreSQL 性能优化全方位指南:深度提升数据库效率
在现代互联网应用中,数据库性能优化是系统优化中至关重要的一环,尤其对于数据密集型和高并发的应用而言,PostgreSQL(以下简称PG)凭借其丰富的特性和强大的功能,成为很多企业的首选。然而,随着数据规模的扩展和查询复杂度的提升,PostgreSQL的性能问题逐渐显现。本文将详细介绍PostgreSQL性能优化的各个方面,涵盖硬件调优、数据库配置、索引使用、查询优化等内容,帮助你全方位提升数据库的效率。
用户11404404
2024/12/13
4860
postgresql主从复制配置「建议收藏」
postgresql主从复制是一种高可用解决方案,可以实现读写分离。postgresql主从复制是基于xlog来实现的,主库开启日志功能,从库根据主库xlog来完成数据的同步。
全栈程序员站长
2022/09/22
3.4K0
postgresql主从复制配置「建议收藏」
PostgreSQL主备流复制搭建
Postgresql9开始支持流复制(stream replication),作为pg原生的复制技术,有着很好的性能。本文从几个方面全面介绍pg的流复制技术。
数据库架构之美
2019/12/18
3K0
PostgreSQL主备流复制搭建
优化PG查询:一问一答
可以使用Postgres Exporter采集PG的各种指标,并将其发送给普罗米修斯。更多详细信息参考:
yzsDBA
2021/09/29
1.5K0
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
AustinDatabases
2024/11/29
720
PostgreSQL  加索引系统OOM 怨我了--- 不怨你怨谁
相关推荐
从零开始学PostgreSQL (十二):高效批量写入数据库
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文