仓库更新的增量负载

Posted

技术标签:

【中文标题】仓库更新的增量负载【英文标题】:Incremental load for Updates into Warehouse 【发布时间】:2015-11-08 17:57:31 【问题描述】:

我正计划对仓库进行增量加载(尤其是更新 RDBMS 中的源表)。

根据更新日期时间从 RDBMS 捕获临时表中的更新行。但是如何确定目标仓库表中特定行的哪一列需要更新呢?

或者我只是删除仓库表中的特定行(基于临时表中行的主键)并插入新的更新行?

使用 PL/SQL 和 SQL 编码在 RDBMS 和 Warehouse 之间实现增量负载的最佳方式是什么?

【问题讨论】:

太宽泛的问题...查看文档docs.oracle.com/cd/E11882_01/server.112/e25554/transform.htm 这里描述了一些方法:dba.stackexchange.com/a/84163/2047 【参考方案1】:

在我看来,最简单的方法如下:

    创建一个与主机表相同的阶段表。当您执行增量/净更改加载时,将所有更改的记录加载到此表中(基于您的“最后更新”字段)

    根据主键从您的实际表中删除记录。例如,如果您的主键是 customer、part,则查询可能如下所示:

    delete from main_table m where exists ( select null from stage_table s where m.customer = s.customer and m.part = s.part );

    将记录从舞台插入到主表中。

您也可以更新现有记录/插入新记录,但无论哪种方式都是两个步骤。我列出的方法的优点是,即使您的表有分区并且新更新的数据违反了原始分区规则之一,它也可以工作,而更新不会实现这一点。此外,语法要简单得多,因为您的更新必须列出每个字段,而 delete from / insert into 允许您仅列出主键字段。

Oracle 还有一个merge 子句,如果存在则更新,不存在则插入。老实说,我不知道如果你有分区会受到什么影响。

一个主要的警告。如果您的更新包括删除 - 需要从主表中删除的记录,这些都无法解决该问题,您将需要其他方法来处理该问题。根据您的情况,可能没有必要,但需要考虑。

【讨论】:

以上是关于仓库更新的增量负载的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 中的增量负载

Sqoop 带有 Epoch 时间戳的增量负载

如何创建临时表来处理增量负载

从 blob 存储到 azure 表存储的增量负载

记录历史的 T-SQL 中的增量负载

LVS-DR实现基于LAMP的负载均衡