我想知道以下两个查询中的哪一个更具性能?
查询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,所以也许有人会发现它很有用。
答案 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更快,我不会感到惊讶。但这取决于尺寸的尺寸和尺寸以及立方体的稀疏性。这个问题非常理论化,两个查询不会返回相同的结果。