PostgreSQL pg_bulkload 导入 FUNCTION 数据

1 背景知识

本文主要介绍如何使用 pg_bulkload 导入函数所生成的数据。

2 创建函数

DROP TYPE IF EXISTS sample_type CASCADE;
CREATE TYPE sample_type AS (sum integer, name char(23));
CREATE OR REPLACE FUNCTION sample_function() RETURNS SETOF sample_type
    AS $ SELECT salary, upper(last_name) FROM hr.employees $
    LANGUAGE SQL;

3 创建表

创建用于装载 csv 数据的表 zlibrary.isbn

psql -U postgres -d testdb
DROP TABLE IF EXISTS sample_table;
CREATE TABLE sample_table (
    salary integer NOT NULL,
    last_name character varying(25) NOT NULL
);

4 创建控制文件

vi /soft/sample_func.ctl
TABLE = sample_table
TYPE = FUNCTION
WRITER = DIRECT
INPUT = sample_function()          # if to use the user-defined function
#INPUT = generate_series(1, 1000)  # if to use the build-in function, which generate sequential numbers from 1 to 1000

对于以上参数详细信息,请参考 pg_bulkload 控制文件参数

5 导入数据

单进程导入数据的耗时为 1m14.976s

time pg_bulkload -U postgres -d testdb /soft/sample_func.ctl
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
        0 Rows skipped.
        107 Rows successfully loaded.
        0 Rows not loaded due to parse errors.
        0 Rows not loaded due to duplicate errors.
        0 Rows replaced with new rows.

real    0m0.019s
user    0m0.001s
sys     0m0.008s

6 查看导入的数据

SELECT * FROM sample_table ;
//屏幕输出:
salary |        last_name        
--------+-------------------------
  24000 | KING                   
  17000 | KOCHHAR                
  17000 | DE HAAN                
  ........... 
  ........
  .....  
  .. 
  12000 | HIGGINS                
   8300 | GIETZ                  
(107 rows)