MDX 中的 NONEMPTY 和 CROSSJOIN 性能和顺序
NONEMPTY and CROSSJOIN performance and order in MDX
我想知道以下两个查询中哪个查询的性能更高?
查询 1:
SELECT NONEMPTY(CROSSJOIN({[Product].[Category].children},
{[Scenario].[Scenario].members}
)
) ON COLUMNS
FROM [Analysis Services Tutorial]
查询 2:
SELECT CROSSJOIN(NONEMPTY({[Product].[Category].children}),
NONEMPTY({[Scenario].[Scenario].members})
) ON COLUMNS
FROM [Analysis Services Tutorial]
我会说查询 2 更 performant/optimized 因为首先你取出所有不必要的成员然后交叉连接它们。第一个查询交叉连接所有内容,然后取出空值。那是我的猜测,但我希望有人能帮我澄清。
编辑 1回应一个答案的评论
假设我添加了一个度量作为第二个参数,所以它不会转到 "default measure"。第二个查询 return 值如何为空?我指定在非空成员之间进行交叉连接。而且我真的不明白无论涉及的维度如何 return 会有不同的结果。对我来说,他们似乎相当。我没看到什么?
查询 1:
SELECT NONEMPTY(CROSSJOIN({[Product].[Category].children},
{[Scenario].[Scenario].members}
), [Total Internet Sales]
) ON COLUMNS
FROM [Analysis Services Tutorial]
查询 2:
SELECT CROSSJOIN(NONEMPTY({[Product].[Category].children},[Total Internet Sales]),
NONEMPTY({[Scenario].[Scenario].members},[Total Internet Sales])
) ON COLUMNS
FROM [Analysis Services Tutorial]
编辑 2
正如答案所说,查询是不一样的。当@GregGalloway 提出其他场景时,我意识到了。
我用示例数据做了一个 excel,所以也许有人会发现它有用。
它们并不等同,因为我们将return 得到不同的结果。例如,针对真正的 Adventure Works(不是某些教程版本)这两个查询 return 不同的结果。请注意,Clothing/Kentucky 列在第二个查询中显示为空:
SELECT NONEMPTY(CROSSJOIN({[Product].[Category].children},
{[Customer].[State-Province].[State-Province].Members}
), [Measures].[Internet Sales Amount]
) ON COLUMNS
FROM [Adventure Works]
where [Measures].[Internet Sales Amount]
SELECT CROSSJOIN(NONEMPTY({[Product].[Category].children},[Measures].[Internet Sales Amount]),
NONEMPTY({[Customer].[State-Province].[State-Province].Members},[Measures].[Internet Sales Amount])
) ON COLUMNS
FROM [Adventure Works]
where [Measures].[Internet Sales Amount]
请注意,场景维度与 Internet Sales 度量值组无关,我不认为。所以这可能不是一个很好的例子。我为示例选择了产品维度和客户维度。
正如所讨论的(以及您在问题中更新的那样)NonEmpty() 应该始终有第二个参数,以便清楚您正在针对什么措施执行 NonEmpty。您的查询还应该提及一个轴上的度量或 WHERE 子句,这样您就不会 return 一些模糊的 "default measure"。我在我的示例中包含了一个带有度量的 WHERE 子句。
无论如何,回答您的问题...假设度量是物理度量或在 block mode 中运行的经过优化的计算度量,如果查询 1 更快,我不会感到惊讶。但这取决于维度的度量和大小以及立方体的稀疏性。这个问题非常理论化,两个查询没有 return 相同的结果。
我想知道以下两个查询中哪个查询的性能更高?
查询 1:
SELECT NONEMPTY(CROSSJOIN({[Product].[Category].children},
{[Scenario].[Scenario].members}
)
) ON COLUMNS
FROM [Analysis Services Tutorial]
查询 2:
SELECT CROSSJOIN(NONEMPTY({[Product].[Category].children}),
NONEMPTY({[Scenario].[Scenario].members})
) ON COLUMNS
FROM [Analysis Services Tutorial]
我会说查询 2 更 performant/optimized 因为首先你取出所有不必要的成员然后交叉连接它们。第一个查询交叉连接所有内容,然后取出空值。那是我的猜测,但我希望有人能帮我澄清。
编辑 1回应一个答案的评论
假设我添加了一个度量作为第二个参数,所以它不会转到 "default measure"。第二个查询 return 值如何为空?我指定在非空成员之间进行交叉连接。而且我真的不明白无论涉及的维度如何 return 会有不同的结果。对我来说,他们似乎相当。我没看到什么?
查询 1:
SELECT NONEMPTY(CROSSJOIN({[Product].[Category].children},
{[Scenario].[Scenario].members}
), [Total Internet Sales]
) ON COLUMNS
FROM [Analysis Services Tutorial]
查询 2:
SELECT CROSSJOIN(NONEMPTY({[Product].[Category].children},[Total Internet Sales]),
NONEMPTY({[Scenario].[Scenario].members},[Total Internet Sales])
) ON COLUMNS
FROM [Analysis Services Tutorial]
编辑 2
正如答案所说,查询是不一样的。当@GregGalloway 提出其他场景时,我意识到了。
我用示例数据做了一个 excel,所以也许有人会发现它有用。
它们并不等同,因为我们将return 得到不同的结果。例如,针对真正的 Adventure Works(不是某些教程版本)这两个查询 return 不同的结果。请注意,Clothing/Kentucky 列在第二个查询中显示为空:
SELECT NONEMPTY(CROSSJOIN({[Product].[Category].children},
{[Customer].[State-Province].[State-Province].Members}
), [Measures].[Internet Sales Amount]
) ON COLUMNS
FROM [Adventure Works]
where [Measures].[Internet Sales Amount]
SELECT CROSSJOIN(NONEMPTY({[Product].[Category].children},[Measures].[Internet Sales Amount]),
NONEMPTY({[Customer].[State-Province].[State-Province].Members},[Measures].[Internet Sales Amount])
) ON COLUMNS
FROM [Adventure Works]
where [Measures].[Internet Sales Amount]
请注意,场景维度与 Internet Sales 度量值组无关,我不认为。所以这可能不是一个很好的例子。我为示例选择了产品维度和客户维度。
正如所讨论的(以及您在问题中更新的那样)NonEmpty() 应该始终有第二个参数,以便清楚您正在针对什么措施执行 NonEmpty。您的查询还应该提及一个轴上的度量或 WHERE 子句,这样您就不会 return 一些模糊的 "default measure"。我在我的示例中包含了一个带有度量的 WHERE 子句。
无论如何,回答您的问题...假设度量是物理度量或在 block mode 中运行的经过优化的计算度量,如果查询 1 更快,我不会感到惊讶。但这取决于维度的度量和大小以及立方体的稀疏性。这个问题非常理论化,两个查询没有 return 相同的结果。