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 相同的结果。