2009-04-10 91 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發揮的因素呢。我不能說沒有其他重要的事情。

相關問題