数据仓库重复维度行
Posted
技术标签:
【中文标题】数据仓库重复维度行【英文标题】:Datawarehouse duplicate dimension rows 【发布时间】:2009-11-12 15:59:03 【问题描述】:我们开始使用事件日志中的数据加载数据仓库。我们有一个普通的星型模式,其中事实表中的一行代表一个事件。我们的维表是user_agent、ip、referal、page等的典型组合。一维表是这样的:
create table referal_dim(
id integer,
domain varchar(255),
subdomain varchar(255),
page_name varchar(4096),
query_string varchar(4096)
path varchar(4096)
)
我们自动生成 id 以最终加入事实表。我的问题是:在我们的批量加载过程中识别重复记录的最佳方法是什么?在实际插入持久存储之前,我们将日志文件的所有记录上传到临时表中,但是,id 只是自动递增的,因此两天的两个相同的暗记录将具有不同的 id。创建值列的哈希是否合适,然后尝试对其进行比较?似乎尝试在每个值列上进行比较会很慢。有没有针对这种情况的最佳做法?
【问题讨论】:
你用的是什么平台,sql server?甲骨文? mysql?版本? 他正在使用 Vertica,但我相信他在问如何将传入数据规范化到他的维度表中,同时在事实表中保留引用。如果他对每一行进行查找以找出给定事实的维度是否已经存在,那么当您进入数百万行时,它会变得非常慢。散列列以创建主键可能是一个可行的解决方案,但您必须担心生日悖论和可能的冲突。 您可以使用唯一键,如果可以通过 id 插入重复条目(如果它是自动增量) 【参考方案1】:代理 PK 的自动递增整数是可以的,但是(根据 Kimball 先生的说法)维度表也应该有一个自然键。因此,哈希 NaturalKey
列将是有序的,“当前”或“过期”的 Status
列可能对允许 SCD 类型 2 有用。
【讨论】:
酷,散列的 naturalkey 是我们考虑与代理 ID 一起使用的,但我们不确定性能权衡是什么。 为了提高加载性能,您可以维护(每次加载后重新创建)一个维度的键匹配表,例如 (NaturalKey, PrKey),它将自然键与表的最新主键匹配。在加载过程中,为您的记录添加一个哈希列,而不是从 KeyMatchingTable 中查找主键。如果未找到,则表示它是一条新记录,因此请暂存这些记录以供插入。如果找到,意味着它已经存在,所以决定做什么(丢弃,SC1 或 SC2)。然后加载维度表。以上是关于数据仓库重复维度行的主要内容,如果未能解决你的问题,请参考以下文章