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 件のコメント:
コメントを投稿