业务是否依赖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/