有人了解OLAP内部机制吗?

30

我了解一些数据库内部知识。事实上,我曾经实现过一个小型、简单的关系数据库引擎,使用了磁盘上的ISAM结构和BTree索引等等。那非常有趣,也非常有教育意义。现在我更加注意仔细设计数据库模式和编写查询,因为我对关系型数据库管理系统在底层是如何工作有一些了解。

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

信息是如何存储在磁盘上的?哪些数据结构组成了数据立方体?如果MOLAP模型不使用表、列和记录,那么......呢?特别是在高维度数据中,哪种数据结构使得MOLAP模型如此高效?MOLAP实现是否使用类似于关系型数据库管理系统索引的东西?

为什么OLAP服务器在处理自由查询时要好得多?在普通关系型数据库中可能需要几个小时才能完成的聚合,在OLTP立方体中可以在毫秒内完成。是什么样的模型机制使这成为可能?

2个回答

20
我曾经实现了几个类似于OLAP多维立方体的系统,并且以下是我们为使其正常工作所做的事情:
  1. 核心数据存储在一个n维数组中,全部保存在内存中,所有键都通过指向底层数组的指针层次结构来实现。这样,我们可以为同一数据拥有多个不同的键集。数组中的数据相当于事实表,通常只有几个数据片段,例如价格和销售数量。

  2. 底层数组通常是稀疏的,因此创建后,我们会删除所有空白单元格以节省内存。这需要进行大量的指针运算,但它确实起到了作用。

  3. 由于我们有键的层次结构,所以我们可以很容易地编写例程来轻松下钻/上升到层次结构。例如,我们通过遍历月份键来访问一年的数据,这些键又映射到天数和/或周数。在每个级别上,我们将数据聚合作为构建立方体的一部分 - 这使计算更快。

  4. 我们没有实现任何类型的查询语言,但我们支持在所有轴上进行钻取(在最大的立方体中可达7个轴),这直接与用户界面相关联,用户很喜欢。

  5. 我们使用C++实现核心功能,但如今我认为C#也足够快,但我会担心如何实现稀疏数组。

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

6

这本书《Microsoft SQL Server 2008 Analysis Services Unleashed》详细介绍了SSAS 2008的一些特点。它并不完全说明“SSAS在底层是如何工作的”,但对于数据结构方面相当有启示性。(关于确切算法的内容则没有那么详细/具体。)作为一个业余爱好者,我从这本书中学到了一些东西。以下内容都是关于SSAS MOLAP的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接