3

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

查询一:

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 值?我指定在非空成员之间交叉加入。而且我真的不明白无论涉及的维度如何,它们如何返回不同的结果。对我来说,它们似乎相当相似。我没看到什么?

查询一:

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,所以也许有人会发现它很有用。 在此处输入图像描述

4

1 回答 1

3

它们是不等价的,因为这两个查询我们都会返回不同的结果。例如,针对真正的 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]

请注意,场景维度与 Internet Sales 度量值组无关,我不认为。所以这可能不是一个很好的例子。我为示例选择了 Product 维度和 Customer 维度。

正如所讨论的(并且正如你在你的问题中更新的那样) NonEmpty() 应该总是有第二个参数,所以很清楚你正在针对什么测量 NonEmpty。您的查询还应该提到一个轴上的度量或 WHERE 子句,这样您就不会返回一些模糊的“默认度量”。我在示例中包含了一个带有度量的 WHERE 子句。

无论如何,要回答您的问题...假设该度量是物理度量或以块模式运行的经过优化的计算度量,如果查询 1 更快,我不会感到惊讶。但这取决于维度的度量和大小以及立方体的稀疏性。这个问题非常理论化,两个查询不会返回相同的结果。

于 2015-12-02T03:49:08.103 回答