Postgres 批量插入不同的模式

Posted

技术标签:

【中文标题】Postgres 批量插入不同的模式【英文标题】:Postgres bulk insert into different schemas 【发布时间】: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 块来执行此操作。 【参考方案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】:

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

【讨论】:

这应该是“不可能在单个语句中” - 绝对有可能将一个事务插入到不同模式的表中。

以上是关于Postgres 批量插入不同的模式的主要内容,如果未能解决你的问题,请参考以下文章

批量插入在 docker 容器中运行的 Postgres 数据库挂起

postgres 使用存储过程批量插入数据

在 Rails 中批量插入时出错

批量插入中的 Postgres 错误:关系“hibernate_sequence”不存在位置 17

从数据框批量插入到数据库,忽略 Pyspark 中的失败行

批量从Dataframe插入到DB,忽略Pyspark中的失败行