【发布时间】:2019-09-11 16:50:49
【问题描述】:
我正在从一个巨大的 csv 文件进行批量插入,该文件需要同时变成一个关系对象和 JSONB 对象到一个表中。问题是;插入需要进行插入或更新。如果是更新。该列需要将 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;
我尝试将我的脚本包装在 BEGIN 和 COMMIT 中,但它根本没有提高性能,我尝试了一些配置,但似乎没有帮助。
\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 数据。
【问题讨论】:
-
每秒执行 2-5 次插入,请注意这是一百万行插入/更新。我什至尝试重新索引表,但它没有多大作用。不确定 Postgres 11 中是否发生了某些变化,导致我发布的那些配置不起作用或其他什么。
-
你的 json 对象有多大?直到它们变得大得离谱,我每秒插入数千个。 JSON 没有增量更新,因此每次追加时都必须重写整个内容。
-
"\设置 fsync 关闭;"这是 psql 吗?这不是更改数据库参数的语法,而只是使用令人困惑的名称设置脚本变量。无论如何,该数据库参数无法在会话级别更改。
-
JSON 对象不会变得太大。最大条目是 30。所以我不认为这会减慢它的速度。是的,这是 psql,我想我应该直接在服务器上执行此操作? -- 我会看到巨大的收益吗?
-
“psql”没有什么问题,只是“psql”中的
\set没有按照你的想法做。虽然很难看出这有多重要。我不知道该怎么做才能让它更快,因为没有理由一开始就应该那么慢。可以使用系统工具查看系统负载在哪里吗?