我对数据库内部结构有所了解。我之前实际上已经实现了一个小型、简单的关系数据库引擎,使用磁盘上的 ISAM 结构和 BTree 索引以及诸如此类的东西。这很有趣,而且很有教育意义。我知道,现在我对 RDBMS 的底层工作原理有了更多的了解,我对仔细设计数据库模式和编写查询有了更多的认识。

但我对多维 OLAP 数据模型一无所知,而且我很难在互联网上找到任何有用的信息。

信息如何存储在磁盘上?立方体由哪些数据结构组成?如果 MOLAP 模型不使用带有列和记录的表,那么......什么?尤其是在高维数据中,什么样的数据结构使得MOLAP模型如此高效?MOLAP 实现是否使用类似于 RDBMS 索引的东西?

为什么 OLAP 服务器在处理即席查询方面表现得如此出色?可能需要相同类型的聚合 小时 在普通关系数据库中处理的数据在 OLTP 多维数据集中可以以毫秒为单位处理。使这成为可能的模型的基本机制是什么?

有帮助吗?

解决方案

我已经实现了几个说mimiced什么OLAP多维数据集做的系统,这里有几件事情我们没有让他们的工作。

1)的核心数据是在正维阵列保持,所有在存储器中,并且所有的键都通过指针为基础数组的层次结构来实现。这样,我们可以有多种不同的集相同的数据的密钥。所述阵列中的数据的事实表的等同物,往往只会有几个数据块的,在一种情况下,这是价格和销售数量。

2)的基本阵列常常稀疏,所以一旦被创建,我们使用去除所有的空白单元格,以节省存储器 - 大量的硬核指针计算的,但它的工作

3),因为我们有钥匙heirarchies,我们可以写程序很容易可以轻松地深入下/上一个层次。例如,我们将访问数据的一年,经过几个月的密钥,这反过来又映射到天,及/或周去。在每一个层面上,我们将汇总数据,为建立多维数据集的一部分 - 更快进行的计算

4)我们没有实现任何类型的查询语言,但我们并支持我们最大的立方体向下钻取所有轴(截至7),这是直接关系到该用户喜欢的用户界面。

5),我们实现了核心的东西在C ++中,但这些天我觉得C#也足够快,但我担心如何实现稀疏数组。

希望帮助,听上去很有意思。

其他提示

这本书 释放 Microsoft SQL Server 2008 分析服务 相当详细地阐述了 SSAS 2008 的一些特殊性。这并不完全是“SSAS 在幕后的工作原理”,但它很有启发性,尤其是在数据结构方面。(关于确切的算法,它并不是那么详细/具体。)作为该领域的业余爱好者,我从这本书中收集了一些东西。这是关于 SSAS MOLAP 的全部内容:

  • 尽管所有关于多维立方体的讨论,事实表(又名度量组)数据仍然是,对于第一个近似,最终存储在基本的二维表中,每个事实一行。许多 OLAP 操作似乎最终都由迭代 2D 表中的行组成。
  • 然而,MOLAP 内部的数据可能比相应 SQL 表内的数据小得多。一个技巧是每个唯一的字符串仅在“字符串存储”中存储一次。然后,数据结构可以以更紧凑的形式引用字符串(基本上通过字符串 ID)。SSAS 还以某种形式压缩 MOLAP 存储中的行。我认为这种缩小可以让更多数据同时保留在 RAM 中,这很好。
  • 同样,SSAS 通常可以迭代数据的子集而不是完整的数据集。有一些机制在发挥作用:
    • 默认情况下,SSAS为每个维度/属性值构建一个哈希索引;因此,它“立即”知道磁盘上的哪些页面包含相关数据,例如 Year=1997。
    • 有一个缓存架构,其中数据的相关子集存储在与整个数据集分开的 RAM 中。例如,您可能缓存了一个仅包含几个字段的子多维数据集,并且仅与 1997 年的数据相关。如果查询仅询问 1997 年,那么它将仅迭代该子多维数据集,从而加快速度。(但请注意,“子立方体”初步近似只是一个二维表。)
    • 如果您是预定义的聚合,那么这些较小的子集也可以在多维数据集处理时预先计算,而不仅仅是按需计算/缓存。
  • SSAS 事实表行的大小是固定的,这可能在某种程度上有所帮助。(相比之下,在 SQL 中,您可能有可变宽度的字符串列。)
  • 缓存架构还意味着,一旦计算出聚合,就不需要一次又一次地从磁盘重新获取并重新计算。

无论如何,这些都是 SSAS 中发挥作用的一些因素。我不能说没有其他重要的事情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top