有人对OLAP Internals有所了解吗?

时间:2009-04-10 04:48:36

标签: algorithm data-structures theory olap cubes

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

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

如何将信息存储在磁盘上?多维数据集包含哪些数据结构?如果MOLAP模型不使用表,列和记录,那么......什么?特别是在高维数据中,哪种数据结构使MOLAP模型如此高效? MOLAP实现是否使用类似于RDBMS索引的东西?

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

2 个答案:

答案 0 :(得分:19)

我已经实现了一些模仿OLAP多维数据集所做的系统,这里有一些我们为使它们工作而做的事情。

1)核心数据保存在n维数组中,全部存储在内存中,所有密钥都是通过指向底层数组的指针层次结构实现的。通过这种方式,我们可以为同一数据提供多组不同的密钥。数组中的数据相当于事实表,通常它只有几个数据,在一个例子中,这是售出的价格和数量。

2)底层数组通常是稀疏的,所以一旦它被创建,我们就会删除所有空白单元以节省内存 - 大量的硬核指针算法但它有效。

3)由于我们有密钥的层次结构,我们可以很容易地编写例程来轻松地向下/向上钻取层次结构。例如,我们将通过查看月份键来访问年份数据,而这些键又映射到数天和/或数周。在每个级别,我们将聚合数据作为构建多维数据集的一部分 - 更快地进行计算。

4)我们没有实现任何类型的查询语言,但我们确实支持在所有轴上向下钻取(在我们最大的多维数据集中最多7个),这与用户喜欢的UI直接相关。

5)我们在C ++中实现了核心内容,但是现在我认为C#足够快,但是我担心如何实现稀疏数组。

希望有所帮助,听起来很有趣。

答案 1 :(得分:5)

本书Microsoft SQL Server 2008 Analysis Services Unleashed详细阐述了SSAS 2008的一些特殊性。它不是“这就是SSAS如何在引擎盖下工作”,但它非常具有启发性,特别是在数据结构方面。 (它对于确切的算法并不那么详细/具体。)作为这个领域的业余爱好者,我从本书中收集了一些东西。这就是SSAS MOLAP:

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

无论如何,这些都是SSAS中的一些因素。我不能说没有其他重要的东西。