Postgres:UPSERT或INCREMENTAL更新大表

时间:2017-11-15 12:23:20

标签: sql postgresql etl data-warehouse upsert

我有以下问题。

我们在PostgreSQL上有两个系统,一个OLTP系统和我们的数据仓库。我需要将OLTP系统中的一个表与DWH同步,因此它们是相同的。我正在使用Foreign Data Wrapper进行数据库之间的通信,因此同步可以很简单,看起来像这样:

TRUNCATE TABLE target_table;
INSERT INTO target_table SELECT * FROM source_table;

不幸的是,该表对于我们使用的硬件来说是巨大的(数亿行,大约50GB的数据),因此这非常耗时。

我已经找到了一种方法,可以通过增量upsert更快地完成它,基于以下方法。

  1. 通过使用insert_time > SELECT max(insert_time) FROM target_table;行来识别源表中的新行。

  2. 通过加入idsource_table.update_time > target_table.update_time上的两个表来确定需要更新的行。

  3. 这非常好,但是,出现了一个新问题 - 源表中的行可以被删除,因此我需要从目标表中删除相应的行。我试过的所有方法都是慢的,比如这个:

    CREATE VIEW deleted_rows AS SELECT
    target.row_id
    FROM target
    LEFT JOIN source USING(id)
    WHERE source.id IS NULL;
    

    知道如何巧妙而快速地解决这个问题吗?提前感谢您的回复。

0 个答案:

没有答案