MDX中的NONEMPTY和CROSSJOIN性能和顺序

时间:2015-12-02 02:21:28

标签: ssas mdx query-performance adventureworks

我想知道以下两个查询中的哪一个更具性能?

查询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提出了其他场景。 我用样本数据做了一个excel,所以也许有人会发现它很有用。 enter image description here

1 个答案:

答案 0 :(得分:2)

它们不等同,因为两个查询都会返回不同的结果。例如,对于真正的Adventure Works(不是一些教程版本),这两个查询会返回不同的结果。请注意,Clothing / Kentucky列在第二个查询中显示为null:

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]

请注意,Scenario维度与Internet Sales度量值组无关,我不这么认为。所以这可能不是一个好例子。我为我的示例选择了“产品”维度和“客户”维度。

正如所讨论的(以及在您的问题中更新),NonEmpty()应始终具有第二个参数,以便明确您对NonEmpty进行的措施。您的查询还应该提到一个轴上的度量或WHERE子句,这样您就不会返回一些模糊的“默认度量”。我在我的例子中包含了一个带有度量的WHERE子句。

无论如何,要回答你的问题...假设度量是物理度量或在block mode中运行的优化计算度量,如果查询1更快,我不会感到惊讶。但这取决于尺寸的尺寸和尺寸以及立方体的稀疏性。这个问题非常理论化,两个查询不会返回相同的结果。