建模和查询多个事实表

Posted

技术标签:

【中文标题】建模和查询多个事实表【英文标题】:Modelling and querying multiple fact tables 【发布时间】:2018-03-13 08:21:03 【问题描述】:

美好的一天!

我有一个关系数据源,其中包含 3 个相互关联的事实表和模型

下图中的患者就诊(EncounterEventFact 表),将诊断分配给患者(DiagnosisEventFact 表)并为患者收集实验室结果(LabComponentResultFact 表)。他们都共享 EncounterKey 密钥,指定对医生的唯一访问。所有 EncounterKeys 都在 EncounterEventFact 表中并且只有一次。我在内存中使用 SSAS 表格对数据进行建模。

每个事实表都有几百万行(2-4 百万)。 DiagnosisDim 有几万行。 PatientDim 有几百万行(

我的度量是 DiagnosisEventFact 上的 EncounterKeys 的不同计数和 LabComponentResultFact 上的 EncounterKeys 的不同计数。

正在开发的样本报告会在诊断模糊方面进行选择,显示此诊断的唯一访问次数和此诊断的实验室收集访问次数。

诊断 count_visits_diagnosis count_visits_labs


ABC 5 0

防御 10 5

当我在报告中选择所有诊断时,问题就出现了。诊断计数立即测量负载,而实验室计数测量需要永远。当我选择一些诊断报告时,效果很快。

如何改进我的 SSAS 表格模型或计算以有效地处理此类报告?

很遗憾,我无法在数据源端重新建模数据。

【问题讨论】:

模型是简化的,还是外部事实表中的每个键都链接到一个维度,例如实验室和诊断?一般来说;将多个事实表直接链接在一起并不是一个好主意。通常(在一个完美的模式中)你喜欢通过一致维度的事实。理论上,当然。你说不能修改数据源端,但是可以在SSAS中编辑查询吗?我的第一个预感是将中间事实加入两个外部连接(并仅获取所需的键),因此您最终会在模型中得到一个事实。由于它们具有相同的粒度,这应该没有问题。 另外:如果您进行查询以加入事实表:请仅包含所需的列(在这种情况下,仅包含 Encounter-、Patient-、Diagnosis- 和 Lab-Key)。无论如何,您都应该这样做,在您当前的模型中也是如此:删除所有不需要的键。这将加速引擎 - 很多 -。 @TJ_ 感谢您的 cmets。我确实尝试通过 SSAS 中的左外连接删除中间遭遇事实。但是这里的问题是在两个外部事实之间建立过滤关系,并且在不使用中间事实的情况下,据我所知,这在 SSAS 中根本不可能,因为它既不是受支持的 SSAS 关系 1-Many、Many-1 或 1-1 . 我的意思是,您在模型查询中通过 SQL 创建连接。然后你最终只得到一个事实表,过滤就可以了。 @TJ_ 你的意思是在 SQL 中将图片中的 3 个事实表连接起来以创建单个连接的事实表吗? 【参考方案1】:

一个模式可以有一个或多个事实,但这些事实没有任何关键关系链接。最佳实践是不要像查询规范化/跨国数据库那样在单个查询中连接事实表。由于多对多连接等的性质 - 如果尝试,结果将不正确。

建议遵循 Kimball 所说的“钻探”过程。钻取过程可以分为两个阶段。在第一阶段,查询每颗星,并将结果汇​​总到一个通用的详细级别。在第二阶段,这些结果集根据它们的共同维度进行合并。

Kimball site 中提供了有关此内容的详细信息

类似的问题可以在这里参考:Design of a data warehouse with more than one fact tables

【讨论】:

以上是关于建模和查询多个事实表的主要内容,如果未能解决你的问题,请参考以下文章

如何对链接到具有不同粒度级别的多个事实的维度表进行建模?

从多个表和查询中导入事实表数据

将一个维度加入具有不同粒度的多个事实表

数仓第三篇:详解维度建模之事实表!

数仓第三篇:详解维度建模之事实表!

数据集市建模事实表:列或行中的指标,其中一列称为指标