2012年1月15日日曜日

[PostgreSQL] COPY

1. \copy 命令
客户端命令, 存取的文件保存在客户端, 默认操作当前目录下的文件
数据库普通用户权限即可操作

1-1. CSV 模式 (共通)
=> \copy t from t.csv CSV
=> \copy t to t.csv CSV

1-1-1. 列值可以用双引号 " 包围, 列值内包含双引号 " 的使用 ("")
"1","aaa" => 1,aaa
"1","a""aa" => 1,a"aa

1-1-2. 指定 QUOTE [AS]
|1|,|aaa| => 1,aaa
|1|,|a""aa| => 1,a""aa
|1|,|a|aa| => error

1-1-3. 指定 ESCAPE [AS]
|1|,|a"aa| => 1,a"aa

1-1-4. 指定 FORCE NOT NULL 列名,... (输入用)
1, => 1,空字符串 (长度为 0, 但不是 NULL)

1-1-5. 指定 FORCE QUOTE 列名,... (输出用)
1,aaa => 1,"aaa"


1-2. 文本模式 (默认是 tab 分隔)
=> \copy t from t.txt
=> \copy t to t.txt
=> \copy t to t.txt DELIMITER ':' (指定分隔符)

1-3. NULL 的处理
=> \copy t to t.csv NULL 'null' (NULL 表示为 null)

2. copy (SQL)
服务器命令, 存取的文件保存在服务器端, 并且使用绝对路径,
只有数据库超级用户权限可操作

2-1. CSV 模式
=# copy t from '/path/to/filename' CSV;

2-2. 文本模式
=# copy t from '/path/to/filename';

2-3. stdin, stdout 模式 (普通用户权限即可)
=> copy t to stdout;
=> copy t to stdout CSV;
=> copy t from stdin; (最后用 \.结束)
=> copy t from stdin CSV;
--------------------------------------------------------------------------------
1. copy 或 prepare statment 比一般 insert 快的原因
1-1. 在一个 trans 中
1-2. sql 只解析一次

2. 调整如下参数
fsync = off (copy 后还原为 on)
wal_buffers = 较大的值 (最大 16MB 足够)
wal_level = minimal
archive_mode = off
checkpoint_segments = 100
synchronous_commit = off
full_page_writes = off
maintenance_work_mem = 增加

3. 8.3 以上, copy 前加 ddl 操作 (不写 wal)
archive_mode = off (on 时无效, 写 wal)
BEGIN;
CREATE TABLE test table...
COPY TABLE ...
COMMIT;
END;

4. 指定 psql 或 pg_restore 选项 -1 之后, 自动加上 begin ... commit

5. 其他
删除对象表的 index 和 约束, copy 后重建
多个表同时进行
数据导入后 analyze

6. pg_bulkload

0 件のコメント:

コメントを投稿