加入对 OLAP 和操作数据的查询
Posted
技术标签:
【中文标题】加入对 OLAP 和操作数据的查询【英文标题】:Join query on OLAP and operations data 【发布时间】:2013-05-23 16:39:55 【问题描述】:我在我的数据库中管理具有此架构的工具列表:
[id] int PRIMARY
[name] varchar
每个工具每隔几秒就会发出一次测量值。我将使用此架构将其保存在 OLAP 存储中:
[toolID] int
[time] timestamp
[measurement] int
(我们尚未选择 OLAP 存储,但由于数据量、语义和我们将运行的查询类型,我们假设我们需要一个)
如何查询测量值大于 100 的工具名称列表?挑战在于我需要加入来自 OLAP 和 OLTP 存储的数据。
选项 1 - 在 OLAP 中还保存每次测量的工具名称(非规范化)。问题是工具名称自测量以来可能已更改,我需要最新的。此外,每个工具可能还有更多详细信息(和详细数据),不确定每次测量保存所有信息是否有意义。
选项 2 - OLAP 只返回 ID 列表,然后我向 OLTP 发出查询以获取名称。这将需要具有许多嵌入式 ID 的 SQL 查询,而且似乎不正确。
选项 3 - 每隔几分钟将所有 OLTP 数据同步到 OLAP。但是 OLAP 工具并未针对更新进行优化(例如 Vertica),因此这似乎效率不高。
【问题讨论】:
您的字面意思是测量值>100 还是计数(测量值)>100?与测量记录的数量(百分比)相比,您的工具列表有多大?工具列表及其详细信息真的每隔几分钟就会改变一次吗?如果工具的细节发生变化,您希望旧测量数据与旧细节、新细节还是两者相关联? “最近 6 次测量中的 4 次 > 100”。每个工具都会有数千个测量值。工具列表不会经常改变,但当它改变时,在报告中显示更新的数据很重要。当细节发生变化时,旧的测量应该链接到新的细节。我想我在这里问的是数据仓库中的一个基本问题。我是否需要定期将所有“工具”数据行复制到仓库(保存测量值的地方)以便更容易连接?我在读到 Vertica 在更新方面并不擅长,这个定期副本不是这样的更新吗? 【参考方案1】:通常,在 OLAP/DW 系统中,选项 3 是首选,工具列表及其详细信息将存储在工具维度表中,测量值将存储在测量事实表中。
如果,正如您在评论中提到的,当详细信息发生变化时,您不关心保存工具详细信息的历史记录,以及 更新频率和次数工具细节很小,那我就只更新工具维度中的记录,因为这将是一个相对较少的更新。
如果更新频率很小但实际更新次数很大,那么简单地截断 Tool 维度并插入 OLTP 系统中的所有 Tool 记录可能会更容易和更快。在这种情况下,您需要确保有一种方法可以保留维度键,以便重新连接到已存储的事实测量值。如果您使用基于自动生成序列的代理键,这可能会很困难。
当工具详细信息的更新频率和数量很大时,就会出现真正的问题。在这种情况下,您将不得不退后一步查看整个模型,并确定工具详细信息是否确实属于某个维度,或者它们是否应该拥有自己的事实表。
【讨论】:
谢谢。如果我截断 Tool 维度,则 Tools 和 Measurments 不在同一个 DB 中,因此不可能进行简单的连接。在这种情况下,我需要从事实中获取所有 id,并使用 SQL 的(长)连接或更聪明的机制 (SP),将它们的数据与 OLTP 分开查询。这是正确的吗?此外,如果我确实关心保存工具(及其详细信息)历史记录,那么我需要为每个事实行添加一个维度行(具有当前工具状态)? 在传统的 OLAP/DW 中,所有数据都在同一个数据库中。如果您想截断而不是更新,那么您需要一种正确重新生成维度键的好方法,以便它们可以连接回已经存储的事实数据。例如,如果 OLTP 系统中有一个唯一的 TOOL_ID 列,那么您可以将其用作维度键,因为在截断后它始终可以从 OLTP 系统复制到 OLAP 系统。 如果你想保留工具历史,那么你不需要更新或截断你可以简单地插入。这称为 II 型渐变维度 (SCD) Part 1 和本文的 Part 2 描述了 SCD 类型及其权衡。以上是关于加入对 OLAP 和操作数据的查询的主要内容,如果未能解决你的问题,请参考以下文章