【问题标题】:Postgres bulk insert into different schemasPostgres 批量插入不同的模式
【发布时间】:2020-08-25 17:57:09
【问题描述】:

我们目前将内容存储到 Redis 中以进行临时聚合,并有一个工作人员可以将其批量插入 Postgres。有没有一种方法可以在单个插入事务中跨多个模式进行批量插入?这将消除在 Redis 中聚合事物的需要。或者,有没有更好的方法来聚合请求?

提前感谢您的帮助。

【问题讨论】:

  • 我想您可以设置一个带有 INSERT 触发器的表,并让您的触发器函数的逻辑确定要写入哪个表,然后将其复制到该表中。不是我之前尝试过或基准测试过的东西,但我的期望是这会比每个目标表只插入一个要慢。
  • “单次插入事务”应该是什么?单笔交易——当然,没问题。 Single INSERT - 基本上不可能,INSERT 插入到 single 表中。使用规则或触发器或可能进行分区的解决方法...请提出一个包含详细信息的正确问题。
  • 我会建议一种不同的方法。使用 redis_fdw (pgxn.org/dist/redis_fdw) 使 Postgres 作为外部表访问 Redis 资源。安排查询 Redis 表并插入 Postgres 模式/表的 Postgres SQL 作业。您可以在单个事务中作为匿名 PL/pgSQL do 块来执行此操作。

标签: postgresql


【解决方案1】:

这真的取决于你对“单次插入事务”的意思。

单个INSERT 语句只能影响一个特定的表。但是你仍然可以BEGIN 一个事务(取决于实现),在那里执行你所有的INSERT 然后COMMIT 事务。 这仍然比在许多事务上执行所有INSERTs 更有效,因为它避免了多余的“握手”。

https://www.postgresql.org/docs/current/sql-begin.html

【讨论】:

    【解决方案2】:

    您是否尝试过创建引用两个表的可更新视图,然后批量插入到该视图中?

    【讨论】:

      【解决方案3】:

      你在寻找这样的东西吗?

      with data (c1, c2) as (
        values (1,2),(10,20),(30,40)
      ), s1_insert as (
        insert into schema_one.table_1(c1, c2)
        select c1, c2
        from data
      )
      insert into schema_two.table_2(col1, col2)
      select c1, c2
      from data;
      

      【讨论】:

        【解决方案4】:

        如果您执行插入语句,则将发生单个事务,并且您只能在单个表中插入(因此完全不可能跨多个模式插入 在单个事务中)。

        【讨论】:

        • 这应该是“不可能在单个语句中” - 绝对有可能将一个事务插入到不同模式的表中。
        猜你喜欢
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        • 2018-08-26
        • 1970-01-01
        相关资源
        最近更新 更多