SSAS中Cube的結構

2022-02-28 21:38:21 字數 3254 閱讀 4079

在ssas(sql server analysis services)中構建cube和編寫mdx的時候,我們很容易被一些名詞弄糊塗,比如:dimension(維度),measures dimension(度量維度),measure(度量),hierarchy(層次結構),attribute hierarchy(屬性層次結構),level(級別),cell(單元),member(成員),member property(成員屬性),set(集),turple(元組)等等。要想弄清楚這些名詞,就必須理解cube的結構。

上述名詞的解釋詳見:

cube、dimension和measure

cube就象乙個座標系,每乙個dimension代表乙個座標軸,要想得到乙個點,就必須在每乙個座標軸上取的乙個值,而這個點就是cube中的cell。見下圖(**於

上圖很好的說明了cube、dimension、measure之間的關係。這裡需要注意的是:其實measure也屬於乙個維度,即measures dimension。所有的measure構成了measures dimension,這個維度的只有乙個hierarchy,而且這個hierarchy只有乙個層次(level)

hierarchy、level和memeber

在上節的圖中,每個dimension只有乙個hierarchy,而在實際的環境中,乙個dimension往往有很多hierarchy。因此,上一小節中關於「cube就象乙個座標系,每乙個dimension代表乙個座標軸」這句話其實不夠準確,準確的說應該是每乙個hierarchy代表了乙個座標軸,而hierarchy中每乙個member代表了座標軸上的乙個值。下圖以時間維度為例展示了dimension的內部結構。

此外,我們需要說明的是:

1) 上圖中說明的是一般dimension的結構,在實際的模型中,其實可以做很多自定義的工作。比如:我們可以修改hierarchy的預設member。

2) 一般情況下,ssas中hierarchy的預設member是all(在你的模型中,可能叫其他名稱)。換句話說在mdx中[時間].[財政]等價於[時間].[財政].[all],[時間].[財政].children等價於[時間].[財政].[all].children。

3) dimension_name.hierarchy_name.level_name等價於dimension_name.hierarchy_name.level_name.members。比如:[時間].[財政].[半年]等價於[時間].[財政].[半年].members。level的members是該級別的所有元素(對於[時間].[財政].[半年].members

=,其中前兩個是2023年下的,後兩個屬於2023年),而hierarchy的members包含了該hierarchy下所有的內容。

4) 當且僅當乙個dimension下只有乙個hierarchy,則dimension_name等價於dimension_name.hierarchy_name緯度。比方說:時間維度只有乙個財務hierarchy,則[時間]等價[時間].[財務]。

5) attribute hierarchy中members的層次是兩層(msdn的說法更加準確,這裡簡化了一些):第一層:all,第二層:葉子節點。也就是說它和多層的hierarchy相比,兩者結構完全相同,這是統一維度模型(unified dimensional model)乙個方面的體現。 

注意:採用attribute hierarchy能夠使編寫mdx更加容易,但同時也增加了cube的容量,加大了cells的個數,對效能有負面影響。因此,在建模的時候,我們可以把一些attribute hierarchy的attributehierarchyenabled屬性設定成false,同時在編寫mdx時,以member property的方式來引用,這樣可以在滿足需求的前提下提高效能。

6) measures dimension是乙個特殊的維度,它的members中沒有all這個成員,它的預設member可以在建模時指定。

7)對於一般的維度,其第一層level的預設是「(all)」。

turple和set

如果說cube好像乙個座標系,那麼turple、set的關係就好比點和麵的關係。turple由cube中每個hierarchy的乙個member組成。由於hierarchy的個數非常多,所以一般不可能在turple表示式中把所有的member都明確指定,故此,為了簡化開發,所有沒有明確指定member的hierarchy,用該hierarchy的預設member代替。也就是說:([時間].[財政].[2001].[上半年]) 等價於([時間].[財政].[2001].[上半年],[時間].[日曆].[all])。另外我們需要注意的:

1) 有的說法認為:turple是「cube 上的乙個子集(不斷開的子cube),這個看法是不準確的,因為turple只是乙個點,不是面,它僅僅由每個hierarchy的乙個member組成的。

2) 外面()起來的表示式不一定是turple。比如:([時間].[財政].[半年].members,[時間].[日曆].[2001].[上半年])就不是乙個turple,而是乙個set,其原因在於,turple是點,它僅僅由每個hierarchy的乙個member組成,如果在任何乙個hierarchy上有兩個成員,則其就變成set了。

注意:([時間].[財政].[半年].members,[時間].[日曆].[2001].[上半年])等價於crossjoin([時間].[財政].[半年].members,[時間].[日曆].[2001].[上半年])或*,在ssas的mdx中,我們可以在()中定義多個用逗號分隔開的表示式,編譯器會進行分析,如果發現是set的話,就把它轉化成多個set相乘的形式。

3) set中的turple可以重複。比如:並不等於,因為前者有兩個turple,後者只有乙個。

4) ssas能夠根據上下文的需要,自動把turple變成set,單個member變成turple,多個member變成set。這也是我們常常混淆turple和set的原因。詳細的例子如下:

a)上下文需要set時,([時間].[日曆].[2001].[上半年])自動轉化成。 

b)上下文需要turple時,[時間].[日曆].[2001].[上半年]自動轉化成([時間].[日曆].[2001].[上半年])。

c)上下文需要set時,[時間].[日曆].[2001].children自動轉化成。

總結

總體來看,ssas中的cube的內部結構非常的清晰,在實際開發中,只要多注意一下預設的一些轉化,使用起來是很容易的。

SSAS中Cube的結構

ssas中cube的結構 在ssas sql serveranalysis services 中構建cube和編寫mdx的時候,我們很容易被一些名詞弄糊塗,比如 dimension 維度 measures dimension 度量維度 measure 度量 hierarchy 層次結構 attrib...

SSAS系列 07 多維資料(查詢Cube)

原文 ssas系列 多維資料 查詢cube 1 什麼是mdx?mdx叫做 多維表示式 是一種查詢語言,是一種和sql類似的查詢語言,它基於 xml for analysis xmla 規範,並帶有特定於 sql server analysis services 的擴充套件。2 mdx與sql有什麼區...

SSAS體系結構(綜述)

看到小夥伴的一句話很勵志,借鑑。正文 ssas是一種olap系統集合資料探勘的功能。主要由伺服器元件以及客戶端元件構成。伺服器元件 ssas的伺服器元件是應用程式msmdsrv.exe,作為microsoft windows服務來實現。它支援來自乙個計算機的多個例項,每乙個analysis serv...