我正在为联系历史事实表设计数据仓库事实表设计。我当前的架构看起来像这样:
[FK] DateKey INT
[FK] TimeKey INT
[NK] CustomerNK INT
[NK] CustomerPhoneNK INT
[FK] ContactTypeKey INT
[FK] ContactResultKey INT
[BK] ContactRefBK INT
ContactTS DATETIME
Counter INT (=1)
我的一个应用程序要求是查找ContactResult
维度上的选择列表的最新ContactType
。 ContactType
维度具有ContactClass
属性,该属性将用于标识要过滤的值范围。
上述结构让我可以通过ContactType
获取ContactClass
选项的所有联系信息,我可以处理该列表以获取最新值。
问题是,是否有人可以建议对上述内容进行修改,以便更轻松地获取特定ContactClass
的最新联系事件?目前这是一个交易事实表,但我很乐意改变它,如果它会提高可用性。
此操作将针对广泛的客户(200K +)进行相当频繁的运行,因此性能非常重要。该操作将在Web界面上的C#代码中完成,因此在此实例中,BI Tool特定的解决方案对我没用。
到目前为止,我提出的唯一想法是累积事实表,仅记录每个ContactClass
的最新记录。对此选项的任何改进都将不胜感激。
答案 0 :(得分:0)
如果性能很重要,批量处理是一个选项,那么您可以预先计算并保存事实或ContactType维度中的“最新联系人”属性。
这两项操作都要求您更新历史事实记录以将其设置为“不再是最新的联系人”,但如果您预先计算此属性,则会获得更好的性能。
我倾向于将此属性添加到维度,并更新历史SK以反映不是“最新联系人”的维度成员。
有一些想法,可能有一种聪明的方法来进行此更新。
答案 1 :(得分:0)
如果表现很关键,那么我认为最新联系的附加事实表就好了。毕竟,这就是数据集市的用途 - 预聚合数据以实现快速性能。它不是一个累积的快照,它通常具有时间维度的几个外键,以便测量事件之间的时间跨度。
似乎200k +不是一个非常大的数字,所以你可以用一个更简单的方式用视图来实现同样的事情。我可能有错误的列,但是这样的事情将在索引到位时非常快:
SELECT ContactTypeKey,MAX(ContactTs) 来自factContact GROUP BY ContactTypeKey
然后,该视图可用于通过ContactTypeKey和ContactTs连接回事实表以返回ContactResult。这假定您的表名是factContact,而ContactTs确定最近的,等等。实际上,您可能需要加入日期维度来计算最近的,并且您可能需要按更多维度分组或者可能需要加入ContactClass的contactType维度和分组。我偶尔会使用这种策略,但很难说它在这里有多好用。