我们正在设计一个Staging layer
来处理incremental load
。我想从一个简单的场景开始设计staging
。
在源数据库中有两个表ex,tbl_Department,tbl_Employee。这个表都在目标数据库ex,tbl_EmployeRecord。
上加载一个表正在加载tbl_EmployeRecord的查询是,
SELECT EMPID,EMPNAME,DEPTNAME
FROM tbl_Department D
INNER JOIN tbl_Employee E
ON D.DEPARTMENTID=E.DEPARTMENTID
现在,我们需要识别tbl_Department,tbl_Employee中的增量加载,并将其存储在暂存中,并仅将增量加载加载到目标。
表的列是,
请建议如何为此设计分段来处理插入,更新和删除。
答案 0 :(得分:3)
识别增量数据
增量加载需要基于源表中存在的一些隔离信息。此类信息可帮助您识别要加载的数据的增量部分。通常,记录的加载日期或最后更新日期是一个很好的选择。
考虑到这一点,您的源表有一个日期列,它存储记录的插入日期以及对该记录进行任何更新的日期。在暂存加载期间的任何给定日期,您可以利用此日期来确定自上次分段加载以来新插入或更新的记录,并且您只考虑那些已更改/更新的记录作为增量增量。
鉴于您的表格结构,我不确定您可以使用哪个列。 ID列不会有帮助,就像记录得到更新一样,你不会知道。
维护负载历史记录
存储有关您今天加载了多少的信息非常重要,这样您就可以在下次加载时加载下一部分。为此,请维护一个临时表 - 通常称为Batch Load Details
表。该负载通常具有如下结构:
BATCH ID | START DATE | END DATE | LOAD DATE | STATUS
------------------------------------------------------
1 | 01-Jan-14 | 02-Jan-14 | 02-Jan-14 | Success
在开始加载数据之前,您需要每天在此表中插入一条新记录。新记录的开始日期等于上次成功加载的结束日期,状态为null。加载成功后,您将状态更新为“成功”
修改数据提取查询以利用批量加载表
保存上述加载历史记录后,您可以在提取查询中包含此表格,
SELECT EMPID,EMPNAME,DEPTNAME
FROM tbl_Department D
INNER JOIN tbl_Employee E
ON D.DEPARTMENTID=E.DEPARTMENTID
WHERE E.load_date >= (SELECT max(START_DATE) FROM BATCH_LOAD WHERE status IS NULL)
我的建议不是标准。事实上,你应该根据你的要求仔细评估我的建议。
<强>建议强>
对事务数据使用增量加载,而不是对主数据使用。交易数据的数量通常较高,可以很容易地以增量块的形式进行隔离。主数据往往更易于管理,并且可以每次都以完整方式加载。在上面的例子中,我假设您的Employee表的行为与事务数据相似,而您的department表是您的主表。
我相信this article on incremental loading会对你有所帮助
答案 1 :(得分:0)
我不确定你使用的是什么数据库,所以我只是从概念上讲。如果您想为特定技术添加标签,我们可能会提供具体的建议。
看起来每个员工有1行,而且您只保留每个员工的当前记录。我将假设EMPID是独一无二的。
首先,在当前填充维度的查询中添加一个字段。此字段将是表EMPID,EMPNAME,DEPTNAME中其他字段的哈希值。您可以创建视图,填充新的临时表或仅使用查询。还要将相同的哈希字段添加到维度表。基本上,哈希是一种生成字段的简单方法,该字段对于每个记录是唯一的并且有效地进行比较。
插入:这些是维度表中尚未存在EMPID但在登台查询/视图中确实存在的记录。
更新:这些是登台查询/查看维度表中EMPID 的记录,但哈希字段不匹配。
删除:这些是维度中存在EMPID但在登台查询/视图中不存在的记录。
如果这是高容量的,您可能需要创建新表来保存应插入的记录和应更新的记录。一旦确定了记录,就可以一次性插入/更新它们,而不是逐个插入/更新。
从数据仓库中删除大量记录有点不常见,因为它们通常用于保存历史记录。我建议可能会创建一个状态或位字段列,指示源是否处于活动状态或已删除。当然,如何处理删除应该取决于您的业务需求/报告要求。请记住,如果您进行硬删除,如果您以后决定需要,则永远无法获取该数据。
在适当位置更新现有维度(而不是为每个更改创建历史记录)在维度建模术语中称为类型1维度。这很常见。但是如果您决定需要保留历史记录,则可以使用哈希来帮助您创建SCD类型2记录。