bulk-upsert-postgresql最佳实践

cnh2zyt3  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(402)

在postgresql中,我有一个包含一百万条记录的源表(staging表)和一个包含一百万条记录的目标表(application表)。移动应用程序正在使用目标表(同步)。
我必须从源表到目标表进行合并(冲突时插入),并且有条件地删除目标表中的一些记录。这必须每4小时发生一次(因为stage表中的数据来自不同的源系统)。由于一些代码维护的原因,我不应该使用存储过程。
我可以使用jdbc以不同的偏移量和限制并行执行多个查询吗?它会提高性能吗?
插入测试。。。选择。。。从测试\u stg order by。。偏移量0行仅在冲突时获取前1000行(约束…)do update set。。。
在java代码的单个事务(原子)中并行运行查询的最佳方式是什么?
注意:我可以在目标表中执行delete操作,只要我成功地将stage合并到实际表。

gc0ot86w

gc0ot86w1#

我会一次性删除和插入/更新,类似这样:

WITH cte_delete AS (
    DELETE FROM test_stg
    RETURNING *
)
INSERT INTO test
SELECT *
FROM    cte_delete
ON CONFLICT (...)
DO UPDATE ...;

我不会从任何其他性能优化开始。保持简单和直截了当,大多数时候效果最好。如果你没有问题,你就不能解决任何问题。

相关问题