POSTGRESQL COPY 命令导入数据,你还另一个更快的方案!
POSTGRESQL 数据库数据导入的核心一般都使用COPY 命令,熟悉POSTGRESQL 的同学应该对这个命令不陌生,相对于MYSQL 去一条条的执行insert命令来说,COPY 命令是POSTGRESQL 对于巨量数据导入的外挂。
以下是POSTGRESQL 一段官方的对于COPY 的解释
COPY在PostgreSQL表和标准文件系统文件之间移动数据。COPY TO将表的内容复制到文件中,而COPY FROM将数据从文件复制到表中(将数据追加到表中已经存在的内容)。COPY TO还可以复制SELECT查询的结果。
实际上copy 命令的格式主要由三个部分组成
1 标识copy命令
2 message size 标定
3 数据包(数据流)
实际上COPY 命令中的数据的传入是以数据流的方式进入到数据库中的,所以COPY 命令并不是事务,或者说不是简单的事务。建议在使用copy 命令的时候使用 copy to ,原因已经有很多同学写过这部分的东西了。
今天要说的更快的方案是一个第三方的POSTGRESQL 的工具 , pg_bulkload,命令这个命令相对于COPY 的差异在于,大,什么大,数据量大的情况下,例如将POSTGRESQL 作为数据库仓库使用的时候,导入大量的数据,或者数据导出时的一个,强有力的支持工具。
这个工具的主要特点是跨过了 shared buffers, 在跨过 shared buffers 的情况下将数据导入到数据库中。同时新的版本还具有了 ETL 的部分功能。
下面我们来安装一下这个工具,工具本身支持最新的POSTGRESQL 版本也支持老的9.X 的版本,安装直接通过rpm 包安装并未成功,建议还是通过编译的方式来进行安装,同时在编译的时候需要有对应的PG变量存在,否则安装失败。
我们先看看pg_blukload 的内部构造是怎样的,主体分为两个部分
1 read :包含了ETL 的部分和数据代码转换和过滤的功能
2 writer :跳过 shared buffer 的部分
这里的写过滤的功能是如何完成的,通过以下的部分进行功能的实现
1 记录从文件中读取并一条条的通过 filter
2 当在过滤中发生错误的时候,这条数据就不会被加载,并且将这个问题的记录写入到 parse badfile 中。
3 在过滤的过程中,会验证数据类型和字段的数量,如果不相符则判定为错误
4 对于一些组合类型的字段类型 和 set of 命令等 pg_blukload 不支持。
5 不建议导入数据中的脚本中存在函数,这样会影响导入数据的时间
6 导入数据的时候支持并行功能
7 导入的数据格式支持 CSV , 二进制,函数产生 三种方式
8 写入数据的方式主要包含了,直接加载,direct, 缓冲加载 buffer 方式,二进制方式,并行方式 parallel
下面我们产生两个测试表,同样的表结构
下面我们通过COPY 命令将CSV 数据加载到数据表中,看看时间有多长 100万行数据,整体时间在 1.5秒左右,速度还是很快的。
下面我们转换模式,将数据通过pg_blukload的方式来进行数据的加载,时间1.13秒
使用了pg_blukload 相对COPY的模式,只使用原有时间的76%, 可以想到如果数据量在大一些,则节省的时间是可观的。但需要注意的是,CSV 文件不要有页头,也就是字段的名字一列,否则会当成错误的,导致数据无法被载入。
除了在性能上的优势,pg_blukload 在以下几个方面也是比COPY 要完善的多
1 他具有日志功能,他具有 操作日志, 错误日志,以及重复数据日志等
2 可以通过日志来做成导入 控制文件简化操作,固话操作
3 可以加入一些options 将操作灵活化
下面的命令意思为,导入CSV文件,并且间隔符号是 竖线,同时将原表的数据先清空后,在不跳过buffer 的情况下导入数据。
pg_bulkload
-i /home/postgres/bulk.txt
-O tb_asher
-l /home/postgres/t_output.log
-P /home/postgres/t__bad.txt
-o "TYPE=CSV"
-o "DELIMITER=|"
-o "TRUNCATE=YES"
-o "WRITER=BUFFERED"
另外pg_blukload 最大的重点是,跳过buffer ,也就是不在有wal日志,如何证明这点,我们看看下面的证明过程
我们还是讲上面的操作重复,在每个操作后,我们查看wal current的状态。
下面的操作中有一个问题,不知道大家看没看出来,但已经证明了我的copy操作产生了 wal 日志。
我们在尝试通过pg_blukload 加载数据,通过下图可以看到,并未走日志,也证实了通过pg_blukload 默认数据是不会加载到 shared_buffer 中的事实
所以在基于数据仓库,或大量数据导入的情况下通过pg_blukload 是一个好的加速数据导入的方法。
POSTGRESQL COPY 命令导入数据,你还另一个更快的方案!相关推荐
- PostgreSQL \copy命令实现数据导出到文件
由于linux系统的文件访问权限控制,我们是使用postgres用户进行相关的操作的,因此,执行导出文件之前,先确定导出文件的文件访问权限是postgres,如果不是,那么会报Permission d ...
- MDPI期刊的latex模板使用bib快速导入参考文献(TeXstudio)一个更快更简单的方法!
该方法仅针对MDPI模板,经测试多次完全没有问题,其他论文模板步骤可能会有差别,还在探索,以后补充. 1.在MDPI模板里新建一份文件,命名为references.bib. 可以先建立referenc ...
- PostgreSQL copy 命令教程
报文介绍PostgreSQL copy 命令,通过示例展示把查询结果导出到csv文件,导入数据文件至postgresql. 1. copy命令介绍 copy命令用于在postgreSql表和标准文件系 ...
- Postgres copy命令导入导出数据
前言 最近有需要对数据进行迁移的需求,由于postgres性能的关系,单表3000W的数据量查询起来有一些慢,需要对大表进行切割,拆成若干个子表,涉及到原有数据要迁移到子表的需求.起初的想法是使用存储 ...
- php使用pg中copy命令,PGSQL COPY命令导入/导出数据
PGSQL中可使用COPY命令来导入/导出数据,这里以CSV文件为例. 导出数据: SQL Shell执行: COPY table_name (col1,col2,col3) TO 'path_nam ...
- PostgreSQL COPY命令
COPY Name COPY -- 在表和文件之间拷贝数据 Synopsis COPY table_name [ ( column [, ...] ) ]FROM { 'filename' | STD ...
- 用BULK INSERT命令导入数据详解
转载而来.来源已经不清楚了. 如果你从事与数据库相关的工作,有可能会涉及到将数据从外部数据文件插入倒SQL Server的操作.本文将为大家演示如何利用BULK INSERT命令来导入数据,并讲解怎样 ...
- PostgreSQL使用PgAdmin导入数据
1.创建列 要设置主键: postgresql常用函数>序列函数nextval():设置主键自动增长_野生汪嘤嘤嘤的博客-CSDN博客_nextval() 2.导入数据 3.其他方式参考 Pos ...
- 使用copy命令拷贝数据表
实现同一个数据库不同用户间的表的拷贝 首先看下copy命令的解释 SQL> help copy; COPY ---- Copies data from a query to a table i ...
最新文章
- socket()函数详解!
- 防止程序多开的两种方法
- 改变能改变的,接受不能改变的
- FLASK上传时有中文文件名的解决方案
- python性能分析工具模块_python——关于Python Profilers性能分析器
- 转:使用 Tkprof 分析 ORACLE 跟踪文件
- mysql 并发 锁表_MySQL中的锁(表锁、行锁) 并发控制锁
- 安装部署gitlab ci
- 2. Anaconda下使用Pip或者conda安装库指南
- 从winpe安装系统
- windows权限提升——烂土豆+dll劫持+引号路径+服务权限
- 人再囧途之泰囧.BD高清1280国语中英双字 附下载地址
- 游戏与幼儿教育如何相辅相成
- 计算机操作系统的pv是什么意思,计算机操作系统关于PV操作的一道题
- 微信小程序iBeacon获取问题(wx.onBeaconUpdate不执行)【已解决】
- 耳机不怕丢,Belkin最新降噪耳机支持苹果 Find My
- Java生鲜电商平台-商城后台架构与原型图实战
- std::bitset使用
- K-means 算法实现二维数据聚类
- 服务器操作系统有哪些都怎么读,谁说服务器linux主流?这款操作系统独霸天下...