【问题标题】:Bulk Inserts/Updates Are Slow Using On Conflict with JSONB在与 JSONB 冲突时使用批量插入/更新很慢
【发布时间】: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;

我尝试将我的脚本包装在 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 数据。

【问题讨论】:

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

标签: postgresql postgresql-11


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多