上一篇文章我們簡(jiǎn)單聊了SSAS技術(shù)凝危,今天我們將從基本概念、BI 語義模型和分析場(chǎng)景來介紹 MDX 與 SQL 的區(qū)別尉共。看完本文之后弃锐,相信您會(huì)更加了解為什么 MDX 比 SQL 加適合復(fù)雜分析場(chǎng)景袄友。相信從事過數(shù)據(jù)分析相關(guān)工作的小伙伴,對(duì)于SQL都不陌生霹菊。在各行各業(yè)往往都會(huì)有復(fù)雜的分析需求剧蚣,如半累加,多對(duì)多旋廷,時(shí)間窗口分析等鸠按,編寫SQL語句在處理這些分析場(chǎng)景時(shí)就有些捉襟見肘。而這些分析場(chǎng)景的處理使用MDX語法是最合適的饶碘。下面我們來一起看一些具體對(duì)比分析目尖。
一、MDX 和 SQL 基本概念
1.1熊镣、MDX 是什么卑雁?
MDX ,多維表達(dá)式(Multidimension eXpressions) 是一種 OLAP 多維數(shù)據(jù)集的查詢語言绪囱,類似于SQL的數(shù)據(jù)庫查詢語言测蹲。最初由微軟在1997 年作為 OLEDB for OLAP 規(guī)范引入,隨后集成在 SSAS 技術(shù)中鬼吵。MDX僅僅只是一個(gè)微軟的規(guī)范扣甲,并不是一個(gè)開放的標(biāo)準(zhǔn)。但是這個(gè)規(guī)范正在被越來越多的OLAP服務(wù)提供商所采用齿椅。這正是MDX生命力頑強(qiáng)的體現(xiàn)琉挖。
一個(gè)基本的MDX Select語句樣例如下:
with member [Measures].[DoubleAmount] as '[Measures].[Sales Amount] * 2'
select [Account].[Accounts].Levels(1).AllMembers on columns,
{[Measures].[Sales Amount],? [Measures].[DoubleAmount]} on rows
from [Adventure Works]
where ([Date].[Fiscal].[Fiscal Year].&[2002])
“with” 語句部分;樣例中的第1行涣脚。該語句用于獲取數(shù)據(jù)前的預(yù)處理示辈。在預(yù)處理的過程中,我們可以定義各種各樣的計(jì)算遣蚀,這些計(jì)算包括可命名集合和計(jì)算成員矾麻。在本樣例中,我們定義的是計(jì)算成員芭梯。
通過分析這個(gè)MDX語句樣例险耀,我們可以看出MDX語句有以下幾個(gè)部分:
“select” 語句部分;樣例中的第2玖喘,3行甩牺。該語句用于選擇可獲取的數(shù)據(jù)。
“from” 語句部分累奈;樣例中的第4行贬派。該語句用來定義我們從哪個(gè)數(shù)據(jù)塊獲取數(shù)據(jù)急但。
“where” 語句部分;樣例中的第5行赠群。該語句用來切割數(shù)據(jù)塊羊始,并合計(jì)數(shù)據(jù)。
在這4個(gè)部分中查描,我們可以根據(jù)自己的需求寫出很復(fù)雜的MDX語句以獲得相應(yīng)的數(shù)據(jù)突委。
1.2、SQL 是什么冬三?
SQL匀油,結(jié)構(gòu)化查詢語言 (Structured Query Language) 是一種用于管理關(guān)系型數(shù)據(jù)庫的編程語言,包含 DQL(查詢)勾笆、DML(增刪改)敌蚜、DDL(定義修改元數(shù)據(jù)) 和 DCL(權(quán)限、事務(wù)控制)窝爪。SQL的應(yīng)用范圍也非常廣弛车,本文為了更好讓小伙伴們了解SQL和MDX的區(qū)別,本文只涉及兩種語言的查詢部分的對(duì)比蒲每。一個(gè)基本的SQL Select語句樣例如下::
select * from 數(shù)據(jù)表 where字段名?= 字段值 ?group by 字段名 order by 字段名 [desc]"纷跛。
通過分析這個(gè)sql語句樣例,我們可以看出SQL語句有以下幾個(gè)部分:
select返回用指定的條件在一個(gè)數(shù)據(jù)庫中查詢的結(jié)果
WHERE子句篩選出滿足條件的行集邀杏;
GROUP BY子句對(duì)行集中的行做分組合并贫奠,使得多個(gè)行對(duì)應(yīng)于結(jié)果集中的一行;
應(yīng)用ORDER BY子句對(duì)結(jié)果集中的行排序望蜡。
二唤崭、MDX 和 SQL 查詢方式的主要區(qū)別
2.1、 MDX Select 部分是維度度量或其表達(dá)式脖律。
SQL Select 部分是列或列的表達(dá)式谢肾。
2.2、MDX From部分是多維數(shù)據(jù)集(Cube)小泉,是提前關(guān)聯(lián)并聚合好的數(shù)據(jù)勒叠,查詢時(shí)不需要指定關(guān)聯(lián)關(guān)系。
? ? SQL From部分是關(guān)系表(Table)膏孟,是一條條的明細(xì)記錄,查詢時(shí)需要指定表之間的關(guān)聯(lián)關(guān)系拌汇。
注意:MDX 和SQL雖然有語法區(qū)別柒桑,但是它們?cè)诤芏嗲闆r下是可以等同于的,舉個(gè)例子我們需要查詢Adventure Works 公司 2004年不同銷售渠道的銷售額噪舀。
用 MDX 表示為:
SELECT NON EMPTY { [Measures].[Sales Amount] } ON COLUMNS, NON EMPTY { ([Sales Channel].[Sales Channel].[Sales Channel].ALLMEMBERS ) } ?ON ROWS FROM ?[Adventure Works] WHERE ( [Date].[Fiscal Year].&[2004] )
用 SQL 表示為:
select case when OnlineOrderFlag=1 then 'Internet' ?
? ? ? ? ? else 'Reseller' end ?[Sales Channel],sum(LineTotal) [Sales Amount] from [Sales].[SalesOrderDetail] ?t1 left join [Sales].[SalesOrderHeader] t2 on t1.SalesOrderID=t2.SalesOrderID where year(t2.OrderDate)='2004'
? ? group by case when OnlineOrderFlag=1 then 'Internet' ?
? ? ? ? ? else 'Reseller' end
三魁淳、BI 語義模型
上一篇文章中我們也提到了目前主流的 BI 產(chǎn)品(Tableau, Power BI飘诗,Qlik等)都支持通過 SQL 接口(JDBC/ODBC)連接關(guān)系數(shù)據(jù)庫,也支持 MDX 接口(XMLA)連接多維數(shù)據(jù)庫界逛。但 BI 通過兩種接口獲取到的語義模型有較大的差異下面將具體介紹兩者的差異性昆稿。下面使用的工具有SE-DWA高效數(shù)倉搭建平臺(tái)和數(shù)據(jù)分析工具。
3.1息拜、MDX 語義模型包含維度(維度別名)溉潭,度量(度量別名),維度層級(jí)結(jié)構(gòu)等少欺,數(shù)據(jù)分析師在 BI 端不需要對(duì)模型進(jìn)行業(yè)務(wù)語義的定義喳瓣,這樣的好處是建模工程師可以在OLAP工具中統(tǒng)一定義業(yè)務(wù)用戶分析時(shí)使用的語義模型,而業(yè)務(wù)在使用 BI 工具分析時(shí)無需理解底層表結(jié)構(gòu)赞别,直接使用同步到 BI 工具的維度畏陕、度量、層級(jí)結(jié)構(gòu)仿滔、計(jì)算度量等進(jìn)行分析惠毁。
MDX 對(duì)復(fù)雜分析場(chǎng)景的控制能力比 SQL 更強(qiáng),對(duì)于一些復(fù)雜場(chǎng)景如半累加崎页、時(shí)間窗口分析等鞠绰,MDX 都可以通過簡(jiǎn)單的表達(dá)式來處理。而同樣的邏輯使用 SQL 就需要使用非常復(fù)雜的查詢才能實(shí)現(xiàn)实昨,有些場(chǎng)景甚至無法簡(jiǎn)單通過 BI 發(fā)送的 SQL 查詢來實(shí)現(xiàn)洞豁。
SE-DWA建立的OLAP模型在Tableau中同步OLAP模型
3.2、SQL 語義模型
數(shù)據(jù)庫包含源表和源列荒给,需要分析師 /業(yè)務(wù)用戶手動(dòng)定義表的模型關(guān)聯(lián)關(guān)系丈挟,維度的友好名稱,度量的友好名稱及聚合類型志电,層級(jí)結(jié)構(gòu)的源列順序等曙咽。這些完成后才能進(jìn)行正常的業(yè)務(wù)分析,這樣的好處是終端用戶可針對(duì)分析需求靈活的進(jìn)行數(shù)據(jù)建模挑辆,但同時(shí)也要求用戶對(duì)底層數(shù)據(jù)結(jié)構(gòu)有一定的理解例朱。
SE-DWA建立的數(shù)倉模型在 Tableau 中基于SQL模式的表進(jìn)行建模
3.3、MDX實(shí)現(xiàn)的復(fù)雜分析場(chǎng)景
財(cái)務(wù)分析鱼蝉,是各行各業(yè)中都需要進(jìn)行分析場(chǎng)景洒嗤。其中,應(yīng)收賬款年初金額是一個(gè)半累加度量魁亦,即在時(shí)間維度上不具備累加性渔隶,但是在其他維度具備累加性。為了方便大家理解小黎子在下面進(jìn)行模擬應(yīng)收賬款的記錄如下,需要獲取每年所有客戶年初(年的第一月)和年末(年的最后一月)的應(yīng)收款的總額间唉。
我們按照分析需求绞灼,得到的結(jié)果應(yīng)該如下:
如果使用 SQL,查詢表達(dá)式如下:
如果使用 MDX呈野,需要先定義計(jì)算度量(基礎(chǔ)度量 [Measuers].[科目余額_本位幣期初金額]]=sum(本位幣期初金額])低矮,基礎(chǔ)度量 [Measuers].[科目余額_本位幣期末金額]]=sum(本位幣期
末金額])),如下:
科目余額_本位幣年初金額=([Measures].[科目余額_本位幣期初金額],[維度_日期].[會(huì)計(jì)期間].[會(huì)計(jì)期間].&[1])
科目余額_本位幣年末金額 = ([Measures].[科目余額_本位幣期末金額],[維度_日期].[會(huì)計(jì)期間].[會(huì)計(jì)期間].&[12])
MDX 查詢表達(dá)式為:
select {[Measures].[科目余額_本位幣年初金額], [Measures].[科目余額_本位幣年末金額 ]} on Columns, ?[維度_日期].[會(huì)計(jì)月份].members on Rows from [SE_財(cái)務(wù)解決方案_多維數(shù)據(jù)集]
由上可見在分析場(chǎng)景中MDX 比 SQL 更容易實(shí)現(xiàn)被冒。這個(gè)場(chǎng)景的復(fù)雜度并不高军掂,有些小伙伴可能還是認(rèn)為SQL更好統(tǒng)計(jì)分析。其實(shí)姆打,類似的場(chǎng)景還有其他的常見分析場(chǎng)景良姆,比如賬戶余額分析,倉庫的庫存分析等幔戏。另外玛追,MDX 還能夠支持多對(duì)多分析場(chǎng)景,這是 SQL 所不支持的闲延。
四痊剖、SE-DWA支撐企業(yè)部署的BI 語義層
SE-DWA提供了數(shù)據(jù)倉庫的搭建平臺(tái)可集成市面主流 BI,提供統(tǒng)一的基于大數(shù)據(jù)的業(yè)務(wù)語義層垒玲。為企業(yè)實(shí)現(xiàn)企業(yè)級(jí)業(yè)務(wù)語義層提供了技術(shù)可能性陆馁,并可滿足更多 SQL 很難滿足的復(fù)雜分析場(chǎng)景。
SE-DWA中定義日期語義表
SE-BI + SE-DWA OLAP模型 分析大數(shù)據(jù)場(chǎng)景下產(chǎn)品收入的同比環(huán)比
五合愈、總結(jié)
MDX 和 SQL 都是在 OLAP 查詢中經(jīng)常使用的語言叮贩,主流的 BI 廠商都提供對(duì)兩種接口的支持。兩者的差異在于:
1佛析、MDX 查詢對(duì)應(yīng)的是多維視圖益老,而 SQL 對(duì)應(yīng)的是關(guān)系視圖,在聚合查詢的語法上 MDX 要簡(jiǎn)單許多寸莫。
2捺萌、MDX 的語義模型更加豐富和業(yè)務(wù)友好,而 SQL 的語義模型相對(duì)簡(jiǎn)陋膘茎,需要后續(xù)再定義桃纯。
3,MDX 計(jì)算表達(dá)能力更加豐富披坏,能夠更好的支持復(fù)雜分析場(chǎng)景态坦。
綜上所述,如果業(yè)務(wù)上有復(fù)雜的分析場(chǎng)景需求如半累加棒拂,時(shí)間窗口分析等伞梯,SE-DWA創(chuàng)建的OLAP方案能夠幫您輕松處理,從而更好的專注與業(yè)務(wù)數(shù)據(jù)的分析。?