postgis数据库优化_PostgreSQL批量导入性能优化

现在很多企业都将数据库逐渐由Mysql转向了更加强大而且开源的PostgreSQL数据库。在数据迁移过程中,PostgreSQL数据库导入大量数据时候非常缓慢,本文我们就来说说PostgreSQL数据库批量导入数据时的优化方法和策略。

概述

考虑PostgreSQL数据库批量导入数据时性能缓慢的原因,无非有几个因素:索引,触发器,外键,GUID主键,还有可能是预写日志(WAL)。我们就从这几个影响因素着手优化。当然有可能,本文说的这些技巧都不能有效问题,遇到这样的问题时候,就需要我们具体问题具体分析,并针对性的解决。

关闭日志记录

对于PostgreSQL 9.5及更高版本,可以先将目标表更改为UNLOGGED,然后在加载数据后将其更改回LOGGED:

ALTER TABLE SET UNLOGGED

ALTER TABLE LOGGED

UNLOGGED模式可以确保PostgreSQL不会在变量导入数据时将表写操作记录到预写日志(WAL),从而极大的优化导入过程。但是,由于未记录操作,因此如果在加载过程中发生崩溃或服务器关机等故障,则无法恢复数据。PostgreSQL重新启动后将自动截断任何未记录的表。

另外,未记录的表不会复制到备用服务器。在这种情况下,必须在加载之前删除现有的复制,并在加载之后重新创建。根据主节点中的数据量和备用数据库的数量,重建复制的时间可能会很长,对于高可用性要求来说这是不可接受的。

建议采用以下方法,将数据批量插入未记录的表中:

在将表和数据更改为未记录模式之前对其进行备份;

数据加载完成后,重新创建对备用服务器的任何复制;

对可以轻松重新填充的表使用UNLOGGED的批量插入(例如,大型查找表或维度表)。

删除索引

数据库索引可能在批量数据插入期间导致严重的延迟。因为添加数据过程,对应的索引条目需要实时更新。

建议在开始批量插入之前尽可能删除目标表中的索引,并在导入完成后重新创建索引。同样,在大型表上创建索引可能很耗时,但是比在加载过程中更新索引要快。

DROP INDEX , …

CREATE INDEX ON (column1, …,column n)

创建索引之前,临时提高maintenance_work_mem配置参数可能会有帮助。增加的工作内存可以帮助更快地创建索引。

为了安全起见的另一种选择是使用现有数据和索引在同一数据库中复制目标表。然后,测试有索引和删除索两种情况下批量导入数据的性能对比,然后根据测试结果选择更好的方法。

删除外键

和索引一样,外键约束也会影响大批量导入的性能。因为导入过程中必须检查插入的每个行数据的每个外键是否存在相应的主键。当批量导入时,必须为每一行触发该触发器检查外键,从而增加了开销。

除非受到业务规则的限制,否则建议先从目标表中删除所有外键,在单个事务中加载数据,然后在提交事务后重新创建外键。

ALTER TABLE

DROP CONSTRAINT

BEGIN TRANSACTION

COMMIT

ALTER TABLE

ADD CONSTRAINT

FOREIGN KEY ()

REFERENCES ()...

同样增加maintenance_work_mem配置参数也能提高重新创建外键约束的性能。

暂停触发器

INSERT或DELETE触发器(如果导入过程还涉及从目标表中删除记录)可能会导致批量数据导入延迟。这是因为每个触发器将具有需要检查的逻辑,并且需要在每行被插入或删除后立即完成操作。

建议在批量导入数据之前禁用目标表中的所有触发器,并在导入完成后再启用它们。禁用所有触发器也会强制执行外键约束检查的系统触发器。

ALTER TABLE DISABLE TRIGGER ALL

ALTER TABLE ENABLE TRIGGER ALL

使用多值INSERT

对于成批数据加载,运行数千个或数十万个INSERT语句可能是个糟糕的选择。因为查询优化器必须解析和准备每个单独的INSERT命令,然后进行所有约束检查,作为单独的事务运行并记录日志。而使用多值单个INSERT语句可以节省这些不必要的开支。

INSERT INTO (, , …, )

VALUES

(, , …, ),

(, , …, ),

(, , …, ),

(, , …, ),

...

多值INSERT性能受现有索引的影响。建议在运行命令之前先删除索引,然后再创建索引。

另一个需要注意的地方是PostgreSQL可用于运行多值INSERT的内存量。运行多值INSERT时,RAM中必须容纳大量输入值,并且除非有足够的可用内存,否则该过程可能会失败。

建议将设置effective_cache_size参数到50%,并将shared_buffer设为机器的总内存的参数设为25%。为了安全起见,将导入划分为多条的多值INSERT,每个语句的值不要超过1000行。

使用COPY命令

建议使用PostgreSQL COPY命令从一个或多个文件导入数据。COPY针对批量数据导入会进行额外的优化,比运行大量INSERT语句甚至多值INSERTS的都要快。

COPY [( column1>, … , )]

FROM ''

WITH (, , … , )

使用COPY的还有很多的优势:

它支持文本和二进制文件导入;

本质上是事务性的;

它允许指定输入文件的结构;

它可以使用WHERE子句有条件地导入数据。

运行ANALYZ

这与提高批量数据导入性能无关,但是强烈建议在批量导入之后立即在目标表上运行ANALYZE命令。大量的新导入的行将大大改变数据表中列中的数据分布,并且会使表的统计信息都过时。当用查询优化器使用过时的统计信息时,查询性能可能会非常慢。运行ANALYZE命令将确保更新统计信息。

总结

对于数据库应用程序来说,可能并非每天都会进行批量数据导入,但是在运行时会对查询性能产生影响。这就是为什么有必要尽可能缩短导入时间。DBA可以最大程度地减少意外的事情之一就是在具有类似服务器规格和PostgreSQL配置的开发或准线上环境中进行性能测试并进行优化。每种数据加载方案都是不同的,最好尝试每种方法并找到最好最快的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能家居 (1) ——智能家居整体功能框架

目录 智能家居整体功能框架图硬件部分清单往期文章智能家居整体功能框架图 可作为大学生毕业设计内容,亦可作求职面试话术使用 使用的硬件平台:树莓派3B(型号),CortexA53(架构),博通BCM2837(芯片) 软件平台:Linux,内核版本3.14 本项目实现的功能是通过手机app、…

docker下交叉编译环境配置

为什么在docker中搭建开发环境? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之…

jparepository查询所有_JPA – JpaRepository 中使用的查询方法

默认方法User usernew User();userRepository.findAll();userRepository.findOne(1l);userRepository.save(user);userRepository.delete(user);userRepository.count();userRepository.exists(1l);自定义查询User findByUserName(String userName);也使用一些加一些关键字And、…

Spring jdbc 对象Mapper的简单封装

一般查询实体的时候&#xff0c;都需要这么使用/** * 根据id查询 * * return */ public Emp queryEmpById(Integer id) { String sql "select * from emp where empno ?"; ParameterizedRowMapper<Emp> mappe…

网络编程知识预备(1) ——了解OSI网络模型

参考&#xff1a;简单了解OSI网络模型 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-18 20:07:09 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114968802?spm1001.2014.3001.5502 根据需求摘抄自下面这篇文章&#xff0c;内容非常详…

完全内核移植–kernel3.15.3

目标平台 明远智睿 EK314 CPU I.MAX6Q内核版本 3.15.3编译器 arm-none-linux-gnueabi-gcc-4.8.3 1。下载纯净内核 2。配置Makefile 3。拷贝cp imx_v6_v7_defconfig .config 4。# make menuconfig 退出保存 5。#make zImage 进行第一次编译&#xff0c;看能否通过 6。修改…

antd表格显示分页怎么取消_真相!Word里怎么也删不掉的文档空白页原来是这样...

大家好&#xff0c;我是你们的海宝老师在Word里&#xff0c;经常会遇到这种情况&#xff1a;文档莫名其妙地多出一个或多个空白页&#xff0c;没啥内容却怎么也删不掉。不着急&#xff0c;咱们来一一分析。1、标题前的空白页像这种标题前面有空白&#xff0c;基本就是【段落】设…

ubuntu 搜狗安装搜狗输入法(fcitx)亲测有用

安装搜狗拼音输入法网上很多方法&#xff0c;总结了一下&#xff0c;下面的方法绝对可以&#xff0c;第一步&#xff1a;Ubuntu 默认是安装了ibus.所以删除它sudo apt-get remove ibus对于已经安装老版本的fcitx,删掉再装.sudo apt-get remove fcitx*删除依赖库sudo apt-get au…

网络编程知识预备(2) ——三次握手与四次挥手、流量控制(滑动窗口)、拥塞控制、半连接状态、2MSL

参考&#xff1a;浅显易懂的三次握手与四次挥手 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-19 09:33:20 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114990198?spm1001.2014.3001.5502 参考&#xff1a;&#xff08;四十七&…

面向对象2

python之路——面向对象进阶 阅读目录 isinstance和issubclass反射setattr  delattr  getattr  hasattr__str__和__repr____del__item系列__getitem__  __setitem__  __delitem____new____call____len____hash____eq__回到顶部isinstance和issubclass isinstance(obj…

linux命令deploy_linux命令:du 命令

Linux du命令也是查看使用空间的&#xff0c;但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看&#xff0c;还是和df命令有一些区别的.1&#xff0e;命令格式&#xff1a;du [选项][文件]2&#xff0e;命令功能&#xff1a;显示每个文件和目录的磁盘使用空…

DM9000网卡原理与基地址设置

从上面可以看出DM9000的地址总线就一根&#xff0c;它不像CS8900那样地址总线和数据总线都齐全。而这里只有一根地址线(CMD)&#xff0c;16跟数据线&#xff0c;所以可以确定位宽为16位&#xff0c;而地址线为什么只有一根&#xff0c;这是DM9000决定的&#xff0c;看手册可以知…

采购订单接收备注为必输项

应用 Oracle Inventory 层 Level Function 函数名 Funcgtion Name RCV_RCVRCERC 表单名 Form Name RCVRCERC 说明 Description 采购订单接收备注为必输项 条件 Condition 触发器事件 Tirgger Event WHEN-NEW-FORM-INSTANCE 触发器对象 Tirgger Object…

网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系

参考&#xff1a;SOCKET,TCP,HTTP之间的区别与联系 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-19 11:54:01 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114992140?spm1001.2014.3001.5502 参考&#xff1a;TCP连接、Http连接与S…

debian 9 安装后的配置,debian 9 开发环境。

注意&#xff1a;以下命令用sudo或者以root用户进行 一.Xterm&#xff08;在安装KDE桌面情况下&#xff09;的配置&#xff08;可以黏贴&#xff0c;复制&#xff09;&#xff1a; 首先在根目录下编辑文件.Xresources(没有可以创建) rootdebian:~# vim ~/.Xresources rootdebi…

mysql 左连接 怎么走索引_mysql left join查询没走索引

SELECTt0.ID as id,t0.NAME as name,t0.PHONE as phone,t0.CITY_CODE as cityCode,t0.SHOOTING_TIME as shootingTime,t0.REMARK as remark,t0.SOURCE_FROM as sourceFrom,-- 平台来源t0.REFER as refer,t0.UPDATE_TIME as updateTime,CONCAT(IFNULL(t0.SHOOTING_NAME,),t1.SHO…

嵌入式RT3070 AP模式移植

环境&#xff1a;ubuntu1~14.04.3 编译器&#xff1a;arm-none-linux-gnueabi-gcc-4.8.3 无线网卡为RT3070&#xff0c;驱动分为STA驱动和SoftAP驱动两种&#xff0c;STA驱动支持无线网卡工作在STA模式下&#xff0c;而SoftAP的驱动支持无线网卡工作在软AP的模式下&#xff0…

Wireshark抓包介绍和TCP三次握手分析

wireshark介绍 wireshark的官方下载网站&#xff1a; http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件&#xff0c;功能十分强大。可以截取各种网络封包&#xff0c;显示网络封包的详细信息。 wireshark是开源软件&#xff0c;可以放心使用。 可以运行在Wind…

网络编程知识预备(4) ——了解应用层的HTTP协议与HTTPS协议

参考&#xff1a;简单了解HTTP协议与HTTPS协议 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-15 10:55:13 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114807328?spm1001.2014.3001.5502 编程实现人脸识别需要基于人工智能平台&…

Django之orm查询

ORM相关 MVC或者MVC框架中包括一个重要的部分&#xff0c;就是ORM&#xff0c;它实现了数据模型与数据库的解耦&#xff0c;即数据模型的设计不需要依赖于特定的数据库&#xff0c;通过简单的配置就可以轻松更换数据库&#xff0c;这极大的减轻了开发人员的工作量&#xff0c;不…