仓库更新的增量负载
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
子句,如果存在则更新,不存在则插入。老实说,我不知道如果你有分区会受到什么影响。
一个主要的警告。如果您的更新包括删除 - 需要从主表中删除的记录,这些都无法解决该问题,您将需要其他方法来处理该问题。根据您的情况,可能没有必要,但需要考虑。
【讨论】:
以上是关于仓库更新的增量负载的主要内容,如果未能解决你的问题,请参考以下文章