上一篇文章我们简单聊了SSAS技术,今天我们将从基本概念、BI 语义模型和分析场景来介绍 MDX 与 SQL 的区别。看完本文之后,相信您会更加了解为什么 MDX 比 SQL 加适合复杂分析场景。相信从事过数据分析相关工作的小伙伴,对于SQL都不陌生。在各行各业往往都会有复杂的分析需求,如半累加,多对多,时间窗口分析等,编写SQL语句在处理这些分析场景时就有些捉襟见肘。而这些分析场景的处理使用MDX语法是最合适的。下面我们来一起看一些具体对比分析。
一、MDX 和 SQL 基本概念
1.1、MDX 是什么?
MDX ,多维表达式(Multidimension eXpressions) 是一种 OLAP 多维数据集的查询语言,类似于SQL的数据库查询语言。最初由微软在1997 年作为 OLEDB for OLAP 规范引入,随后集成在 SSAS 技术中。MDX仅仅只是一个微软的规范,并不是一个开放的标准。但是这个规范正在被越来越多的OLAP服务提供商所采用。这正是MDX生命力顽强的体现。
一个基本的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行。该语句用于获取数据前的预处理。在预处理的过程中,我们可以定义各种各样的计算,这些计算包括可命名集合和计算成员。在本样例中,我们定义的是计算成员。
通过分析这个MDX语句样例,我们可以看出MDX语句有以下几个部分:
“select” 语句部分;样例中的第2,3行。该语句用于选择可获取的数据。
“from” 语句部分;样例中的第4行。该语句用来定义我们从哪个数据块获取数据。
“where” 语句部分;样例中的第5行。该语句用来切割数据块,并合计数据。
在这4个部分中,我们可以根据自己的需求写出很复杂的MDX语句以获得相应的数据。
1.2、SQL 是什么?
SQL,结构化查询语言 (Structured Query Language) 是一种用于管理关系型数据库的编程语言,包含 DQL(查询)、DML(增删改)、DDL(定义修改元数据) 和 DCL(权限、事务控制)。SQL的应用范围也非常广,本文为了更好让小伙伴们了解SQL和MDX的区别,本文只涉及两种语言的查询部分的对比。一个基本的SQL Select语句样例如下::
select * from 数据表 where字段名 = 字段值 group by 字段名 order by 字段名 [desc]"。
通过分析这个sql语句样例,我们可以看出SQL语句有以下几个部分:
select返回用指定的条件在一个数据库中查询的结果
WHERE子句筛选出满足条件的行集;
GROUP BY子句对行集中的行做分组合并,使得多个行对应于结果集中的一行;
应用ORDER BY子句对结果集中的行排序。
二、MDX 和 SQL 查询方式的主要区别
2.1、 MDX Select 部分是维度度量或其表达式。
SQL Select 部分是列或列的表达式。
2.2、MDX From部分是多维数据集(Cube),是提前关联并聚合好的数据,查询时不需要指定关联关系。
SQL From部分是关系表(Table),是一条条的明细记录,查询时需要指定表之间的关联关系。
注意:MDX 和SQL虽然有语法区别,但是它们在很多情况下是可以等同于的,举个例子我们需要查询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 产品(Tableau, Power BI,Qlik等)都支持通过 SQL 接口(JDBC/ODBC)连接关系数据库,也支持 MDX 接口(XMLA)连接多维数据库。但 BI 通过两种接口获取到的语义模型有较大的差异下面将具体介绍两者的差异性。下面使用的工具有SE-DWA高效数仓搭建平台和数据分析工具。
3.1、MDX 语义模型包含维度(维度别名),度量(度量别名),维度层级结构等,数据分析师在 BI 端不需要对模型进行业务语义的定义,这样的好处是建模工程师可以在OLAP工具中统一定义业务用户分析时使用的语义模型,而业务在使用 BI 工具分析时无需理解底层表结构,直接使用同步到 BI 工具的维度、度量、层级结构、计算度量等进行分析。
MDX 对复杂分析场景的控制能力比 SQL 更强,对于一些复杂场景如半累加、时间窗口分析等,MDX 都可以通过简单的表达式来处理。而同样的逻辑使用 SQL 就需要使用非常复杂的查询才能实现,有些场景甚至无法简单通过 BI 发送的 SQL 查询来实现。
SE-DWA建立的OLAP模型在Tableau中同步OLAP模型
3.2、SQL 语义模型
数据库包含源表和源列,需要分析师 /业务用户手动定义表的模型关联关系,维度的友好名称,度量的友好名称及聚合类型,层级结构的源列顺序等。这些完成后才能进行正常的业务分析,这样的好处是终端用户可针对分析需求灵活的进行数据建模,但同时也要求用户对底层数据结构有一定的理解。
SE-DWA建立的数仓模型在 Tableau 中基于SQL模式的表进行建模
3.3、MDX实现的复杂分析场景
财务分析,是各行各业中都需要进行分析场景。其中,应收账款年初金额是一个半累加度量,即在时间维度上不具备累加性,但是在其他维度具备累加性。为了方便大家理解小黎子在下面进行模拟应收账款的记录如下,需要获取每年所有客户年初(年的第一月)和年末(年的最后一月)的应收款的总额。
我们按照分析需求,得到的结果应该如下:
如果使用 SQL,查询表达式如下:
如果使用 MDX,需要先定义计算度量(基础度量 [Measuers].[科目余额_本位币期初金额]]=sum(本位币期初金额]),基础度量 [Measuers].[科目余额_本位币期末金额]]=sum(本位币期
末金额])),如下:
科目余额_本位币年初金额=([Measures].[科目余额_本位币期初金额],[维度_日期].[会计期间].[会计期间].&[1])
科目余额_本位币年末金额 = ([Measures].[科目余额_本位币期末金额],[维度_日期].[会计期间].[会计期间].&[12])
MDX 查询表达式为:
select {[Measures].[科目余额_本位币年初金额], [Measures].[科目余额_本位币年末金额 ]} on Columns, [维度_日期].[会计月份].members on Rows from [SE_财务解决方案_多维数据集]
由上可见在分析场景中MDX 比 SQL 更容易实现。这个场景的复杂度并不高,有些小伙伴可能还是认为SQL更好统计分析。其实,类似的场景还有其他的常见分析场景,比如账户余额分析,仓库的库存分析等。另外,MDX 还能够支持多对多分析场景,这是 SQL 所不支持的。
四、SE-DWA支撑企业部署的BI 语义层
SE-DWA提供了数据仓库的搭建平台可集成市面主流 BI,提供统一的基于大数据的业务语义层。为企业实现企业级业务语义层提供了技术可能性,并可满足更多 SQL 很难满足的复杂分析场景。
SE-DWA中定义日期语义表
SE-BI + SE-DWA OLAP模型 分析大数据场景下产品收入的同比环比
五、总结
MDX 和 SQL 都是在 OLAP 查询中经常使用的语言,主流的 BI 厂商都提供对两种接口的支持。两者的差异在于:
1、MDX 查询对应的是多维视图,而 SQL 对应的是关系视图,在聚合查询的语法上 MDX 要简单许多。
2、MDX 的语义模型更加丰富和业务友好,而 SQL 的语义模型相对简陋,需要后续再定义。
3,MDX 计算表达能力更加丰富,能够更好的支持复杂分析场景。
综上所述,如果业务上有复杂的分析场景需求如半累加,时间窗口分析等,SE-DWA创建的OLAP方案能够帮您轻松处理,从而更好的专注与业务数据的分析。