员工维度在数据仓库中每天被截断

Posted

技术标签:

【中文标题】员工维度在数据仓库中每天被截断【英文标题】:Employee Dimension Truncated everyday in Datawarehouse 【发布时间】:2019-04-09 17:24:32 【问题描述】:

我正在开发一个新的数据仓库,我的员工维度的源表每天都会被截断,并重新加载所有历史记录和更新、删除和新插入。

跟踪这些更改的列是生效日期和生效顺序。我们还有一个审核表,通过比较今天和前一天的表格,帮助我们确定每天更新、插入和删除的记录。

我的问题是如何在暂存层中的表上进行增量加载,以便作为标识列的代理键保持不变。如果我对最终维度进行截断,那么我每次都会得到新的代理键我截断了,因此它弄乱了我的事实表。

【问题讨论】:

请帮助!!!。我找到了一种方法来跟踪身份列 DBCC CHECKIDENT ('.dimEmployee' , RESEED, 1) 。这种方法是否有任何漏洞或场景不捕获。我还将截断并重新加载将使用员工密钥的事实表。 始终将标识列作为 PK 不应该是一种通用方法,在设计阶段我们必须考虑清楚。这些是会导致问题的问题类型。当您希望重新加载能力时,这是一个普遍的问题。您应该保留源的 PK,或者如果它是一个问题或滚动维度,您可以将其设为多部分键 【参考方案1】:

截断维度绝不是一个好主意。您将失去跟踪事实表将引用的主键的能力。

如果您必须每天截断维度,那么您不应该使用自动增量键。相反,您应该将维度的先前状态与新状态进行比较,并查找键值以便保留它们。

示例:您的 dim 有 2 个条目,员工 A 和员工 B,分别具有键 1 和 2。第二天,员工 A 更新为 AA,并添加了员工 C。您应该可以将这个新数据集与旧数据集进行比较,这样 AA 仍然有键 1,B 保留在键 2 中,C 与键 3 一起添加。当然您不能依赖自增键,并且必须从以前的位置设置它们

另外,请注意删除:仅仅因为删除了员工并不意味着与该员工有关的事实也会消失。不要从事实表中删除记录,而是添加一个“已删除”标志并将其设置为 Y 以表示已删除的记录。在您的报告中,过滤掉那些已删除的员工,这样您就只报告未删除的员工。

但是,最好的方案始终是不截断表,而是在维度中执行必要的更新,保留主键(应该是合成的,并且无论如何都不是来自源系统)和任何没有的属性' t 更改,将那些从源系统中删除的标记为已删除,并相应地更新版本号、有效日期等。

您的问题似乎与 Kimball 所描述的 II 型缓慢变化维度非常接近,您的 ETL 应该能够处理。

【讨论】:

非常感谢【参考方案2】:

只要您拥有唯一标识一名员工的业务密钥,源上的表截断就不会代表真正的问题。如果是这样,满足您的要求的最佳方法是将您的员工维度作为类型 2 SCD 处理。

ETL 软件通常提供管理 SCD 的组件。然而,处理 SCD 的一种方法可能在于根据您要跟踪的属性定义散列。然后,如果对于给定的业务键,您注意到在源上计算的新哈希与您存储在维度中的哈希不同,您将更新该记录的所有属性。

希望这会有所帮助。

【讨论】:

以上是关于员工维度在数据仓库中每天被截断的主要内容,如果未能解决你的问题,请参考以下文章

SSIS 暂存截断仓库

数据仓库 ETL 缓慢 - 更改维度中的主键?

根据可变日期查询数据仓库

在数据仓库场景中使用 WITH(NOLOCK) 有啥缺点吗

使用触发器链接到数据仓库中事实表中的时间维度是个好主意吗?

聊聊数据仓库中的缓慢变化维度(SCD)