【问题标题】:NONEMPTY and CROSSJOIN performance and order in MDXMDX 中的 NONEMPTY 和 CROSSJOIN 性能和顺序
【发布时间】:2015-12-02 02:21:28
【问题描述】:

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

查询 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 响应 cmets 的回答

假设我添加了一个度量作为第二个参数,因此它不会转到“默认度量”。第二个查询如何返回 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,所以也许有人会发现它很有用。

【问题讨论】:

    标签: ssas mdx query-performance adventureworks


    【解决方案1】:

    它们是不等价的,因为这两个查询我们将返回不同的结果。例如,针对真正的 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 销售度量值组无关,我不认为。所以这可能不是一个很好的例子。我为示例选择了 Product 维度和 Customer 维度。

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

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

    【讨论】:

    • NonEmpty 使用一个参数。我针对 Adventureworks 多维数据集测试的两个查询以及返回的结果和相同的结果。
    • 它可能与一个参数一起工作,但正在针对“默认度量”执行 NonEmpty。这可能不是你想要的,所以我建议你将你想要的度量作为第二个参数。
    • @elvainch 在这种情况下,它可能返回了相同的结果,但不能保证其他数据。查询 2 可以返回对于该产品和场景的组合具有空度量值的行。
    • @elvainch 我已经更新了我的答案,以显示查询的两个公式并不总是返回相同的结果并澄清我的答案。
    • 现在看到您的查询,我明白为什么他们不返回相同的输出。我必须在一个例子中看到它才能理解它。交叉连接两个非空集,并不意味着不会得到一个空单元格并且有意义。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-03-17
    • 2014-04-25
    • 2011-01-05
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多