【问题标题】:Slow MDX query when it contains 2 or more levels of the same dimension当 MDX 查询包含 2 个或更多级别的相同维度时,速度较慢
【发布时间】: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 子句时,查询如何相互对抗?

标签: mdx olap mondrian


【解决方案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)。这就是我现在在我的架构中拥有的内容,尽管我认为它并不理想。
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多