2009-04-10 96 views
27

我知道一些关于数据库内部的知识。实际上,我已经实现了一个小型,简单的关系数据库引擎,在磁盘上使用ISAM结构和BTree索引等等。这很有趣,而且很有教育意义。我知道我现在更加认识如何仔细设计数据库模式和编写查询,现在我更了解RDBMS如何在底层工作。任何人都知道关于OLAP内部的任何事情?

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

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

为什么OLAP服务器在处理临时查询时更好?在一个普通的关系数据库中处理可能需要小时的相同种类的聚合可以在毫秒中在OLTP多维数据集中处理。这个模型的底层机制是什么使之成为可能?

回答

18

我已经实现了几个模仿OLAP多维数据集的系统,下面是我们为了让他们工作而做的一些事情。

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

2)底层数组通常是稀疏的,所以一旦它被创建,我们用来删除所有的空白单元来节省内存 - 大量的硬核指针算术,但它的工作。 3)由于我们有多个键,我们可以很容易地编写例程来轻松地向上/向下钻取一个层次结构。例如,我们可以访问数据年份,方法是查看月份密钥,然后将这些密钥映射到日期和/或星期。在每个级别上,我们都会将数据聚合为建立立方体计算速度更快的一部分。我们没有实现任何类型的查询语言,但是我们确实支持所有轴上的向下钻取(在我们最大的多维数据集中多达7个),并且这直接与用户喜欢的UI相关联。 5)我们用C++实现了核心内容,但是现在我认为C#可以足够快,但我担心如何实现稀疏数组。

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

5

该书Microsoft SQL Server 2008 Analysis Services Unleashed详细说明了SSAS 2008的一些特点。这不完全是“SSAS如何在底层工作”,但它非常具有启发性,特别是在数据结构方面。 (关于确切的算法,它并不是很详细/具体。)作为这方面的业余爱好者,我从本书中收集了一些内容。这是所有关于SSAS MOLAP:

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

这些都是在SSAS发挥的因素呢。我不能说没有其他重要的事情。

相关问题