我想知道以下两个查询中哪个更有效?

查询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的性能/优化程度更高,因为首先您要取出所有不必要的成员,然后将它们交叉联接。第一个查询将所有内容交叉连接,然后取出空值。那是我的猜测,但我希望有人可以让我明白。

编辑1 响应答案的评论

可以说我添加了一个度量作为第二个参数,因此它不会转到“默认度量”。第二个查询如何返回具有null的值?我指定非空成员之间的交叉连接。而且我真的不知道无论涉及到什么维度,该方法如何都能返回不同的结果。在我看来,它们似乎相当。我没看到什么?

查询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提出了其他方案。
我在样本数据方面表现出色,因此也许有人会发现它很有用。
ssas - MDX中的NONEMPTY和CROSSJOIN性能和顺序-LMLPHP

最佳答案

它们并不等效,因为这两个查询我们将返回不同的结果。例如,对于真正的Adventure Works(不是某些教程版本),这两个查询返回不同的结果。请注意,“服装/肯塔基”列在第二个查询中显示为空:

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销售”度量标准组无关。因此,这可能不是一个很好的例子。我为示例选择了产品维度和客户维度。

正如所讨论的(以及您在问题中所做的更新),NonEmpty()应该始终具有第二个参数,因此很清楚您针对NonEmpty采取了什么措施。您的查询中还应提及一个轴上的度量或WHERE子句,这样您就不会返回模糊的“默认度量”。我的示例中包含了带有度量的WHERE子句。

无论如何,要回答您的问题...假设该度量是物理度量或在block mode中运行的经过优化的经过计算的度量,如果查询1更快,我不会感到惊讶。但这取决于度量,尺寸的大小以及多维数据集的稀疏性。这个问题是非常理论性的,两个查询不会返回相等的结果。

10-03 00:33