批量 Inserts/Updates 与 JSONB 冲突时使用缓慢

Bulk Inserts/Updates Are Slow Using On Conflict with JSONB

我正在从一个巨大的 csv 文件执行批量插入,该文件需要同时转换为关系对象和 JSONB 对象,转换为 table。问题是;插入需要做以太插入或更新。如果是更新的话。该列需要将 JSON 对象附加到该行。我目前的设置有单独的 INSERT/UPDATE 个调用,当然,它非常慢。

示例导入命令我是 运行:

INSERT INTO "trade" ("id_asset", "trade_data", "year", "month") VALUES ('1925ad09-51e9-4de4-a506-9bccb7361297', '{"28":{"open":2.89,"high":2.89,"low":2.89,"close":2.89}}', 2017, 3)  ON CONFLICT ("year", "month", "id_asset") DO
UPDATE SET "trade_data" = "trade"."trade_data" || '{"28":{"open":2.89,"high":2.89,"low":2.89,"close":2.89}}' WHERE "trade"."id_asset" = '1925ad09-51e9-4de4-a506-9bccb7361297' AND "trade"."year" = 2017 AND "trade"."month" = 3;

我试过将我的脚本包装在 BEGINCOMMIT 中,但它根本没有提高性能,我尝试了一些配置,但似乎没有帮助.

\set autocommit off;
set schema 'market';
\set fsync off;
\set full_page_writes off;
SET synchronous_commit TO off;
\i prices.sql

这个漏洞非常慢,我不确定如何在不使用我的程序将大量垃圾数据加载到 RAM 的情况下重写查询,只是为了有效地吐出一个大的 INSERT/UPDATE 命令供 Postgres 阅读。由于相关数据可能是一百万行或另一个文件,因此可以正确生成 JSON 而不会丢失数据库中已有的当前 JSON 数据。

只需 scp 将我的大 SQL 文件移动到 Postgres 服务器并重新运行 psql 中的命令,现在迁移速度非常快。