暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

技术前刊:PostgreSQL12 COPY和bulkloading提升

yanzongshuaiDBA 2019-06-14
1105

业务是否依赖COPY命令加载数据?PostgreSQL12提供了一个新特性,大大加快了加载速度。

COPY:Loading and unloading data as fast as possible

细看PostgreSQL12的COPY语法,发现有两处变动:

1)\h 会有手册文档链接

2)COPY支持WHERE条件

下面是完整语法:

  1. db12=# \h COPY

  2. Command:     COPY

  3. Description: copy data between a file and a table

  4. Syntax:

  5. COPY table_name [ ( column_name [, ...] ) ]

  6.     FROM { 'filename' | PROGRAM 'command' | STDIN }

  7.     [ [ WITH ] ( option [, ...] ) ]

  8.     [ WHERE condition ]

  9. COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }

  10.     TO { 'filename' | PROGRAM 'command' | STDOUT }

  11.     [ [ WITH ] ( option [, ...] ) ]

  12. where option can be one of:

  13.     FORMAT format_name

  14.     FREEZE [ boolean ]

  15.     DELIMITER 'delimiter_character'

  16.     NULL 'null_string'

  17.     HEADER [ boolean ]

  18.     QUOTE 'quote_character'

  19.     ESCAPE 'escape_character'

  20.     FORCE_QUOTE { ( column_name [, ...] ) | * }

  21.     FORCE_NOT_NULL ( column_name [, ...] )

  22.     FORCE_NULL ( column_name [, ...] )

  23.     ENCODING 'encoding_name'

  24. URL: https://www.postgresql.org/docs/12/sql-copy.html


虽然添加文档链接功能带来便利,但是WHERE过滤功能更加有用。这个功能的目的是什么?当前,COPY只能导入整个文件。但是某些场景下会有问题:很多场景下,人们只想加载数据的一个子集,并且在导出前必须编写大量代码进行过滤。

COPY...WHERE: 导入时过滤

PostgreSQL通过该条件可以轻松地进行过滤。下面讲述一个简单的例子:

  1. db12=# CREATE TABLE t_demo AS

  2.         SELECT * FROM generate_series(1, 1000) AS id;

  3. SELECT 1000


首先先插入1000行数据,然后导出到一个文件:

  1. db12=# COPY t_demo TO '/tmp/file.txt';

  2. COPY 1000


最后,再重新导入数据:

  1. db12=# CREATE TABLE t_import (x int);

  2. CREATE TABLE

  3. db12=# COPY t_import FROM '/tmp/file.txt' WHERE x < 5;

  4. COPY 4

  5. db12=# SELECT * FROM t_import;

  6.  x

  7. ---

  8.  1

  9.  2

  10.  3

  11.  4

  12. (4 rows)


如上说是,过滤数据非常简单直接。需要注意,导出列是“id”,导入列是“x”。文件文件不知道导入表的表结构---需要确保过滤导入表的列名。

其他特性

COPY可以将数据发送到UNIX pipe,还可以从pipe中读取数据。如下所示:

  1. db12=# COPY t_demo TO PROGRAM 'gzip -c > /tmp/file.txt.gz';

  2. COPY 1000

  3. db12=# COPY t_import FROM PROGRAM 'gunzip -c /tmp/file.txt.gz'

  4.     WHERE x BETWEEN 100 AND 103;

  5. COPY 4

  6. db12=# SELECT * FROM t_import WHERE x >= 100;

  7.   x  

  8. -----

  9.  100

  10.  101

  11.  102

  12.  103

  13. (4 rows)


某些场景下,不止想将数据导出。上面场景,我们想导出数据时将数据压缩;导入时将数据解压并过滤。如上所示,这种方法非常简单。

原文

https://www.cybertec-postgresql.com/en/tech-preview-improving-copy-and-bulkloading-in-postgresql-12/

最后修改时间:2019-11-24 18:38:13
文章转载自yanzongshuaiDBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论