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/pgSQLdo
块来执行此操作。
【参考方案1】:
这真的取决于你对“单次插入事务”的意思。
单个INSERT
语句只能影响一个特定的表。但是你仍然可以BEGIN
一个事务(取决于实现),在那里执行你所有的INSERT
然后COMMIT
事务。
这仍然比在许多事务上执行所有INSERT
s 更有效,因为它避免了多余的“握手”。
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 数据库挂起