通过您的应用程序去和处理每一行是 很多 慢,直接将数据加载到服务器。即使使用优化的代码。另外,插入/在一个时间更新一行是 很多 又慢于处理的一次。
如果导入文件在服务器本地可用,则可以使用COPY
。否则,您可以
copy在标准界面中使用meta命令
psql。您提到了JSON,为此,您必须将数据转换为合适的平面格式,例如CSV。
如果只想向表中添加新行:
COPY tbl FROM '/absolute/path/to/file' FORMAT csv;
或者,如果您想插入/更新一些行:
首先,请为temp_buffers使用足够的RAM
(如果可以的话,至少暂时使用),这样就不必将temp表写入磁盘。请注意,必须在访问 此 会话中的任何临时表之前完成
此操作 。
SET LOCAL temp_buffers='128MB';
内存中的表示要比数据的on.disc表示占用更多的空间。因此,对于一个100 MB的JSON文件..减去JSON开销,再加上一些Postgres开销,128
MB可能足够,也可能不够。但是您不必猜测,只需进行测试并进行测量:
select pg_size_pretty(pg_total_relation_size('tmp_x'));创建临时表:
CREATE TEMP TABLE tmp_x (id int, val_a int, val_b text);
或者,仅复制现有表的结构:
CREATE TEMP TABLE tmp_x AS SELECT * FROM tbl LIMIT 0;
复制值(应该花 几秒钟 ,而不是几小时):
COPY tmp_x FROM '/absolute/path/to/file' FORMAT csv;
从那里使用简单的旧SQL进行INSERT / UPDATE。在计划复杂的查询时,您甚至可能想要在临时表上添加一两个 索引 并运行
ANALYZE:
ANALYZE tmp_x;
例如,要更新现有行,并匹配
id:
UPDATE tblSET col_a = tmp_x.col_aUSING tmp_xWHERe tbl.id = tmp_x.id;
最后,删除临时表:
DROP TABLE tmp_x;
或者在会话结束时自动将其删除。



