当 MDX 查询包含同一维度的 2 个或更多级别时,速度较慢
Slow MDX query when it contains 2 or more levels of the same dimension
我在蒙德里安中有一个具有以下级别的维度:
-维度 - 按分钟计算时间
--等级-小时
--等级-分钟
如果我使用单个级别进行查询,则需要几秒钟的时间来处理。但是,如果我将两个级别都添加到查询中,查询将花费半个小时。
此外,如果我将维度复制为 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]
知道为什么会发生这种情况吗?
"Why"我不确定。
您可以尝试多种方法来加快查询速度。
尝试使用交叉连接来利用自动存在的行为,并将 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];
这基本上是因为蒙德里安:
Mondrian 的关键性能优化之一是使用 native.crossjoin。但是,由于两个级别都属于同一维度,因此无法执行它。因此,解决方案是在多个维度中将级别分开,因为它们将成为同一组的一部分。
我在蒙德里安中有一个具有以下级别的维度:
-维度 - 按分钟计算时间
--等级-小时
--等级-分钟
如果我使用单个级别进行查询,则需要几秒钟的时间来处理。但是,如果我将两个级别都添加到查询中,查询将花费半个小时。
此外,如果我将维度复制为 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]
知道为什么会发生这种情况吗?
"Why"我不确定。
您可以尝试多种方法来加快查询速度。
尝试使用交叉连接来利用自动存在的行为,并将 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];
这基本上是因为蒙德里安:
Mondrian 的关键性能优化之一是使用 native.crossjoin。但是,由于两个级别都属于同一维度,因此无法执行它。因此,解决方案是在多个维度中将级别分开,因为它们将成为同一组的一部分。