代码之家  ›  专栏  ›  技术社区  ›  benjismith

有人知道关于OLAP内部的任何信息吗?

  •  28
  • benjismith  · 技术社区  · 16 年前

    我对数据库内部有点了解。实际上,我以前已经实现了一个小型的、简单的关系数据库引擎,在磁盘和btree索引上使用isam结构,诸如此类。很有趣,很有教育意义。我知道,我对仔细设计数据库模式和编写查询有了更多的了解,现在我对RDBMS如何在引擎盖下工作有了更多的了解。

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

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

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

    2 回复  |  直到 13 年前
        1
  •  19
  •   MrTelly    16 年前

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

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

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

    3)由于我们继承了密钥,所以我们可以很容易地编写例程,以便轻松地向下/向上钻取层次结构。例如,我们将通过月键访问数据年份,而月键又映射到日和/或周。在每一个层次上,我们都将聚集数据作为构建多维数据集的一部分,从而使计算速度更快。

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

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

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

        2
  •  5
  •   Chris    13 年前

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

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

    不管怎样,这些都是SSAS发挥作用的一些因素。我不能说没有其他重要的事情。