当 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 个或更多级别的相同维度时,速度较慢的主要内容,如果未能解决你的问题,请参考以下文章

如何构建仅考虑 2 月最后 10 天发生的事实的 MDX 查询?

使用 olap4j Api 获取 Mdx 中维度的根级别

MDX 查询以对具有特定日期范围的日期维度进行分组

Pentaho BA 服务器中的 MDX 查询失败

如何使用 MDX 查询检索内部节点的数据集?

范围内总和计数的 MDX 计算