我有以下问题。
我们在PostgreSQL上有两个系统,一个OLTP系统和我们的数据仓库。我需要将OLTP系统中的一个表与DWH同步,因此它们是相同的。我正在使用Foreign Data Wrapper进行数据库之间的通信,因此同步可以很简单,看起来像这样:
TRUNCATE TABLE target_table;
INSERT INTO target_table SELECT * FROM source_table;
不幸的是,该表对于我们使用的硬件来说是巨大的(数亿行,大约50GB的数据),因此这非常耗时。
我已经找到了一种方法,可以通过增量upsert更快地完成它,基于以下方法。
通过使用insert_time > SELECT max(insert_time) FROM target_table;
行来识别源表中的新行。
通过加入id
和source_table.update_time > target_table.update_time
上的两个表来确定需要更新的行。
这非常好,但是,出现了一个新问题 - 源表中的行可以被删除,因此我需要从目标表中删除相应的行。我试过的所有方法都是慢的,比如这个:
CREATE VIEW deleted_rows AS SELECT
target.row_id
FROM target
LEFT JOIN source USING(id)
WHERE source.id IS NULL;
知道如何巧妙而快速地解决这个问题吗?提前感谢您的回复。