在进行分析查询时,有人可以向我展示 MDX 优于常规 SQL 的一个很好的例子吗?我想将 MDX 查询与给出相似结果的 SQL 查询进行比较。
虽然可以将其中的一些转换为传统 SQL,但即使对于非常简单的 MDX 表达式,它也经常需要合成笨拙的 SQL 表达式。
但是既没有引用也没有例子。我完全清楚底层数据必须以不同的方式组织,并且 OLAP 将需要每次插入进行更多的处理和存储。(我的建议是从 Oracle RDBMS 迁移到Apache Kylin + Hadoop)
上下文:我试图说服我的公司我们应该查询 OLAP 数据库而不是 OLTP 数据库。大多数 SIEM 查询大量使用分组依据、排序和聚合。除了性能提升之外,我认为 OLAP (MDX) 查询比等效的 OLTP SQL 更简洁、更易于读/写。一个具体的例子可以说明这一点,但我不是 SQL 专家,更不用说 MDX ...
如果有帮助,以下是针对过去一周发生的防火墙事件的与 SIEM 相关的 SQL 查询示例:
SELECT 'Seoul Average' AS term,
Substr(To_char(idate, 'HH24:MI'), 0, 4)
|| '0' AS event_time ,
Round(Avg(tot_accept)) AS cnt
FROM (
SELECT *
FROM st_event_100_#yyyymm-1m#
WHERE idate BETWEEN trunc(sysdate, 'iw')-7 AND trunc(sysdate, 'iw')-3 #stat_monitor_group_query#
UNION ALL
SELECT *
FROM st_event_100_#yyyymm#
WHERE idate BETWEEN trunc(sysdate, 'iw')-7 AND trunc(sysdate, 'iw')-3 #stat_monitor_group_query# ) pm
GROUP BY substr(to_char(idate, 'HH24:MI'), 0, 4)
|| '0'
UNION ALL
SELECT 'today' AS term ,
substr(to_char(idate, 'HH24:MI'), 0, 4)
|| '0' AS event_time ,
round(avg(tot_accept)) AS cnt
FROM st_event_100_#yyyymm# cm
WHERE idate >= trunc(sysdate) #stat_monitor_group_query#
GROUP BY substr(to_char(idate, 'HH24:MI'), 0, 4)
|| '0'
ORDER BY term DESC,
event_time ASC
Run Code Online (Sandbox Code Playgroud)
Tom*_*m V 11
MDX和SQL完全不一样,甚至常常没有可比性,因为它们分别是查询multidimensional和relational databases。您无法使用 MDX 查询现有的关系数据库。
使用多维模型并使用 MDX 进行查询的主要优点是您正在查询预先聚合的数据,并且 MDX 已优化为以统计方式而不是关系方式查询。您不再查询行和表来生成平面结果集,而是使用元组和集来切片和聚合多维多维数据集。
可以这样想:如果您使用 SQL 查询来获取特定项目组的总销售额,您需要编写一个查询来汇总项目组中所有项目的所有发票行。如果您使用多维数据集并在项目组级别进行聚合,则在处理期间计算结果,并为每个项目组存储聚合,从而使查询即时进行。
多维和 MDX 是与基于关系集的 SQL 完全不同的概念。
您的示例可能会变得更简单,因为您将在数据加载过程中进行诸如日期解析之类的转换,而您上个月的比较可能是calculated measure. 你的首尔平均值和今天可能是calculated members
如果您的多维数据集针对您的要求设计得很好,我相信您可以对示例的数据集进行切片和切块,甚至无需编写查询,而是在数据透视表或其他分析工具中进行。
然后再一次没有“只是在 MDX 中重写 SQL”。它需要相当多的知识才能正确地做到这一点,并且需要一种不同的心态。想想维恩图而不是结果集。
为了向您提供一个使用 Adventureworks 数据库的示例,假设需要按客户在自行车类别中列出销售订单的数量。
如果您使用 SQL 执行此操作,您将需要编写一个查询来计算销售订单的数量,该查询包含恰好属于自行车类别的产品行,并将其连接到客户表中,因此这将成为一个相当复杂的查询.
-- need distinct count, we're counting orders, not order lines
SELECT count(DISTINCT soh.salesorderid)
,pers.FirstName + ' ' + pers.LastName
FROM sales.SalesOrderDetail sod
-- we need product details to get to the category
INNER JOIN Production.Product p ON sod.ProductID = p.ProductID
-- but we need to pass via subcategories
INNER JOIN Production.ProductSubcategory psc ON p.ProductSubcategoryID = psc.ProductSubcategoryID
-- we finally get to the category
INNER JOIN Production.ProductCategory pc ON psc.ProductCategoryID = pc.ProductCategoryID
-- we also need the headers because that's where the customer is stored
INNER JOIN sales.SalesOrderHeader soh ON sod.SalesOrderID = soh.SalesOrderID
-- finally the customer, but we don't have his name here
INNER JOIN sales.Customer c ON soh.CustomerID = c.CustomerID
-- customers
INNER JOIN Person.Person pers ON c.PersonID = pers.BusinessEntityID
-- filter on bikes
WHERE pc.Name = 'bikes'
-- but the customers table doesn't contain the concatenated name
GROUP BY pers.FirstName + ' ' + pers.LastName;
Run Code Online (Sandbox Code Playgroud)
在 MDX 中(假设您的多维数据集针对此要求进行了精心设计)您可以直接编写,因为逻辑和复杂性已转移到其他地方:
SELECT [Measures].[Internet Order Count] ON COLUMNS,
[Customer].[Customer].Members ON ROWS
FROM [Adventure Works]
WHERE [Product].[Product Categories].[Category].[Bikes]
Run Code Online (Sandbox Code Playgroud)
OLAP 多维数据集/数据库具有以下特征:
MDX 与 SQL :
MDX 用于导航多维数据库并定义对其所有对象(维度、层次结构、级别、成员和单元格)的查询,以获取(简单地)数据透视表的表示。
MDX 使用许多与 SQL 相同的关键字,例如SELECT, FROM, WHERE。不同之处在于 SQL 生成关系视图,而 MDX 生成数据的多维视图。
两种语言的总体结构也存在差异:
SQL 查询:SELECT column1, column2, ..., column FROM table
MDX 查询:SELECT axis1 ON COLUMNS, axis2 ON ROWS FROM cube
FROM指定数据源:
在 SQL 中:一个或多个表
在 MDX 中:一个多维数据集
SELECT 表示查询希望恢复的结果:
在 SQL 中:
在 MDX 中:
度量:单价、数量、折扣、销售金额、运费
维度:时间
层次结构:年 > 季度 > 月 > 与成员:
年份:2010、2011、2012、2013、2014
季度:Q1、Q2、Q3、Q4
月份:一月、二月、三月……
维度:客户
层次结构:大陆 > 国家 > 州 > 城市,成员:
城市:巴黎、里昂、柏林、科隆、马赛、南特……
州:Loire atlantique、Bouches du Rhône、Bas Rhin、都灵……
国家:奥地利、比利时、丹麦、法国、...
大陆级别:欧洲、北美、南美、亚洲
维度:产品
层次结构:类别 > 子类别 > 具有成员的产品:
| 归档时间: |
|
| 查看次数: |
15636 次 |
| 最近记录: |