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 命令导入数据,你还另一个更快的方案!相关推荐

  1. PostgreSQL \copy命令实现数据导出到文件

    由于linux系统的文件访问权限控制,我们是使用postgres用户进行相关的操作的,因此,执行导出文件之前,先确定导出文件的文件访问权限是postgres,如果不是,那么会报Permission d ...

  2. MDPI期刊的latex模板使用bib快速导入参考文献(TeXstudio)一个更快更简单的方法!

    该方法仅针对MDPI模板,经测试多次完全没有问题,其他论文模板步骤可能会有差别,还在探索,以后补充. 1.在MDPI模板里新建一份文件,命名为references.bib. 可以先建立referenc ...

  3. PostgreSQL copy 命令教程

    报文介绍PostgreSQL copy 命令,通过示例展示把查询结果导出到csv文件,导入数据文件至postgresql. 1. copy命令介绍 copy命令用于在postgreSql表和标准文件系 ...

  4. Postgres copy命令导入导出数据

    前言 最近有需要对数据进行迁移的需求,由于postgres性能的关系,单表3000W的数据量查询起来有一些慢,需要对大表进行切割,拆成若干个子表,涉及到原有数据要迁移到子表的需求.起初的想法是使用存储 ...

  5. php使用pg中copy命令,PGSQL COPY命令导入/导出数据

    PGSQL中可使用COPY命令来导入/导出数据,这里以CSV文件为例. 导出数据: SQL Shell执行: COPY table_name (col1,col2,col3) TO 'path_nam ...

  6. PostgreSQL COPY命令

    COPY Name COPY -- 在表和文件之间拷贝数据 Synopsis COPY table_name [ ( column [, ...] ) ]FROM { 'filename' | STD ...

  7. 用BULK INSERT命令导入数据详解

    转载而来.来源已经不清楚了. 如果你从事与数据库相关的工作,有可能会涉及到将数据从外部数据文件插入倒SQL Server的操作.本文将为大家演示如何利用BULK INSERT命令来导入数据,并讲解怎样 ...

  8. PostgreSQL使用PgAdmin导入数据

    1.创建列 要设置主键: postgresql常用函数>序列函数nextval():设置主键自动增长_野生汪嘤嘤嘤的博客-CSDN博客_nextval() 2.导入数据 3.其他方式参考 Pos ...

  9. 使用copy命令拷贝数据表

    实现同一个数据库不同用户间的表的拷贝 首先看下copy命令的解释 SQL> help copy; COPY  ---- Copies data from a query to a table i ...

最新文章

  1. socket()函数详解!
  2. 防止程序多开的两种方法
  3. 改变能改变的,接受不能改变的
  4. FLASK上传时有中文文件名的解决方案
  5. python性能分析工具模块_python——关于Python Profilers性能分析器
  6. 转:使用 Tkprof 分析 ORACLE 跟踪文件
  7. mysql 并发 锁表_MySQL中的锁(表锁、行锁) 并发控制锁
  8. 安装部署gitlab ci
  9. 2. Anaconda下使用Pip或者conda安装库指南
  10. 从winpe安装系统
  11. windows权限提升——烂土豆+dll劫持+引号路径+服务权限
  12. 人再囧途之泰囧.BD高清1280国语中英双字 附下载地址
  13. 游戏与幼儿教育如何相辅相成
  14. 计算机操作系统的pv是什么意思,计算机操作系统关于PV操作的一道题
  15. 微信小程序iBeacon获取问题(wx.onBeaconUpdate不执行)【已解决】
  16. 耳机不怕丢,Belkin最新降噪耳机支持苹果 Find My
  17. Java生鲜电商平台-商城后台架构与原型图实战
  18. std::bitset使用
  19. K-means 算法实现二维数据聚类
  20. 服务器操作系统有哪些都怎么读,谁说服务器linux主流?这款操作系统独霸天下...

热门文章

  1. 洛谷P1518 两只塔姆沃斯牛
  2. CVE-2014-3704 Drupal SQL注入漏洞
  3. 字典树与01字典树详解
  4. 代码生活,体验苦修生活?
  5. PCA-SIFT:一个更鲜明地局部图像描述符
  6. 28日进行招标 财政部十一前将再发行320亿元特别国债
  7. 关于java字符串拼接处理方法的总结
  8. python之励志公式
  9. css 两张图片两端对齐,实现css两端对齐
  10. PPT画好的图如何保持高的清晰度粘贴到Word