当 MDX 查询包含 2 个或更多级别的相同维度时,速度较慢
Posted
技术标签:
【中文标题】当 MDX 查询包含 2 个或更多级别的相同维度时,速度较慢【英文标题】:Slow MDX query when it contains 2 or more levels of the same dimension 【发布时间】:2015-08-14 14:24:17 【问题描述】:我在蒙德里安有一个维度,具有以下级别:
-维度 - 以分钟为单位的时间
--等级-小时
--级别-分钟
如果我使用单个级别进行查询,则需要几秒钟来处理。但是,如果我将这两个级别都添加到查询中,查询将需要半小时。
更重要的是,如果我将维度复制为 2,因此每个维度都有一个级别,那么查询也需要几秒钟。
单级查询:
WITH
SET [~COLUMNS] AS
[Event].[Event].[Event Name].Members
SET [~ROWS] AS
[Time by Minute].[Time by Minute].[Minute].Members
SELECT
NON EMPTY [~COLUMNS] ON COLUMNS,
NON EMPTY [~ROWS] ON ROWS
FROM [spdoc views]
2 级查询:
WITH
SET [~COLUMNS] AS
[Event].[Event].[Event Name].Members
SET [~ROWS] AS
Hierarchize([Time by Minute].[Time by Minute].[Hour].Members, [Time by Minute].[Time by Minute].[Minute].Members)
SELECT
NON EMPTY [~COLUMNS] ON COLUMNS,
NON EMPTY [~ROWS] ON ROWS
FROM [spdoc views]
任何想法为什么会发生这种情况?
【问题讨论】:
我猜第二个查询比第一个查询要稀疏得多。因此,当您使用NON EMPTY
子句时,引擎必须做更多的工作来删除空单元格。当您从两者中删除 NON EMPTY
子句时,查询如何相互对抗?
【参考方案1】:
所以基本上这是因为蒙德里安:
Mondrian 的一项关键性能优化是使用 native.crossjoin。但是,由于两个级别属于同一维度,因此无法执行它。因此,一个解决方案是当它们将成为同一集合的一部分时,将它们分成几个维度。
【讨论】:
【参考方案2】:“为什么”我不确定。
您可以尝试多种方式来加快查询速度。
尝试使用交叉连接来利用自动存在的行为并将Hierarchize
移动到SELECT
中
WITH
SET [~COLUMNS] AS
[Event].[Event].[Event Name].Members
SET [~ROWS] AS
[Time by Minute].[Time by Minute].[Hour].Members
* [Time by Minute].[Time by Minute].[Minute].Members
SELECT
NON EMPTY [~COLUMNS] ON COLUMNS,
NON EMPTY Hierarchize([~ROWS]) ON ROWS
FROM [spdoc views];
最好还是将NonEmpty
应用于集合[~ROWS]
。你有什么可以用来衡量的吗?:
WITH
SET [~COLUMNS] AS
[Event].[Event].[Event Name].Members
SET [~ROWS] AS
NonEmpty(
[Time by Minute].[Time by Minute].[Hour].Members
* [Time by Minute].[Time by Minute].[Minute].Members
, [Measures].[SomeMeasureInCube]
)
SELECT
NON EMPTY [~COLUMNS] ON COLUMNS,
NON EMPTY Hierarchize([~ROWS]) ON ROWS
FROM [spdoc views];
【讨论】:
我已经看到,如果我 CrossJoin Hours and Minutes 查询速度会加快。但是,由于两个级别都属于同一个维度,我需要复制它(例如:创建 Time by Minute 2 维度和 CrossJoin)。这就是我现在在我的架构中拥有的内容,尽管我认为它并不理想。以上是关于当 MDX 查询包含 2 个或更多级别的相同维度时,速度较慢的主要内容,如果未能解决你的问题,请参考以下文章