Ssas MDX中的子选择与切片器

Ssas MDX中的子选择与切片器,ssas,mdx,ssas-2012,ssas-tabular,Ssas,Mdx,Ssas 2012,Ssas Tabular,如果我希望在MDX中任何元组的上下文中计算结果,但不希望此元组成为结果的一部分,我将使用以下两个选项之一 1。子选择 SELECT [Measures].[SomeMeasure] ON 0, [DimName].[HierName].children ON 1 FROM (SELECT foo.bar.&[Val] ON 0 FROM [MyCube]) 2。切片机 SELECT [Measures].[SomeMeasure] ON 0, [DimName].[HierName].

如果我希望在MDX中任何元组的上下文中计算结果,但不希望此元组成为结果的一部分,我将使用以下两个选项之一

1。子选择

SELECT [Measures].[SomeMeasure] ON 0,
[DimName].[HierName].children ON 1
FROM
(SELECT foo.bar.&[Val] ON 0 FROM
[MyCube])
2。切片机

SELECT [Measures].[SomeMeasure] ON 0,
[DimName].[HierName].children ON 1
FROM    
[MyCube]
WHERE (foo.bar.&[Val])
我想到的第三个选项是
EXISTS
子句,但很快我意识到它的意思完全是为了其他东西


因此,撇开其他方面不谈,我感兴趣的是这些查询的一般性能,需要记住的任何基准或最佳实践,以及在什么情况下应该使用哪种基准或最佳实践。

与大多数优化器问题一样,答案是:这取决于。我想说,在许多情况下,WHERE更快,但也有subselect更快的情况

优化器通常不是供应商对每个细节都有文档记录的工具(即使某些文档比其他文档记录得更多,而AnalysisServices是具有文档记录较少的优化器的引擎的典型示例)。我认为他们的代码中有很多很多规则,比如“如果这个和那个,但没有第三个条件,那么就沿着这条路线走”。这是不断变化的,因此任何文档或多或少都会过时

如前所述,对于许多关系引擎来说,情况要好一点,对于SQL Server,您至少可以展示一个或多或少可以理解的计划。但即使在那里,您也不知道为什么优化器选择了这个计划而不是另一个计划,有时还必须尝试几种方法使优化器走上另一条道路(比如使用索引…)。SQL Server的新版本可能会以不同的方式处理问题,希望在大多数情况下更好,但在少数情况下可能更糟

这显然也不是一种清晰且有文档记录的代码编写方式,而只是一种尝试和错误

总之:您必须使用多维数据集和典型查询进行测试

无论如何,在许多情况下,性能差异非常小,与此无关


最后,AnalysisServices优化器可用的最佳文档是位于的一位AnalysisServices查询引擎开发人员的旧博客。这是一个博客,它不是很系统,只是一些随机的优化器行为样本的集合,以及背后的原因。

据我所知,如果您想缓存查询结果并提高总体吞吐量,那么切片器更好,但如果您只关心单个查询的性能,那么使用subselect可以获得更好的性能

回答下面的问题,, 以下信息来自Chris Webb

首先,需要指出的是,subselect和Where子句做了两件不同的事情——它们不是在所有情况下都可以互换的,它们可能返回不同的结果,有时一个性能更好,有时另一个更好,因为它们可能会生成不同的查询计划。在所有多维数据集上,一种技术并不总是“优于”另一种,性能上的任何差异都可能因服务包而异

回答最初的问题:使用您找到的能够提供最佳查询性能并返回您想要查看的结果的选项。一般来说,我更喜欢Where子句(它没有被弃用);原因是,虽然在某些情况下,子选择最初可能执行得更快,但它限制了Analysis Services缓存计算结果的能力,这意味着长期性能会降低:

通过子选择,您仍然可以将
foo.bar.
添加到行或列中,但使用where切片器,这是不可能的。从我所做的简短阅读来看,如果你想玩视觉总计,子选择似乎非常好。例如,在你的第一个脚本中,
foo.bar.
的所有成员现在将与
foo.bar.&Val]
的总计相同。子选择首先发生,并减少了多维数据集中的空间,因此我认为会有一些性能提升,特别是当外部查询比较复杂时。在你的问题上加上星号(和+1)表示你有兴趣看到答案。是的,子查询(或子选择)在灵活性方面提供了更多。但这正是为什么我想知道他们是否有黑暗的一面?如果不是的话,我更愿意选择它们,因为它们提供了更多的功能。但是,当它们这样做的时候,为什么它们会这样做,必须有一些规则。发动机内部到底发生了什么?我正在寻找任何可能澄清问题的参考资料。@Sourav_Agasti供应商通常不会向您提供其优化器内部工作的详细信息,这是关系引擎的情况,对于Analysis Services更是如此。我认为他们的代码中有很多很多规则,比如“如果这个和那个,但没有第三个条件,那么就沿着这条路线走”。这是不断变化的,因此任何文档或多或少都会过时。如前所述,关系引擎的情况要好一点,对于SQL Server,您至少可以展示一个或多或少可以理解的计划。(续)(续)但即使在那里,您也不知道优化器选择此计划而不是另一个计划的确切原因,有时必须尝试几种方法使优化器走上另一条道路(如使用索引…)。显然,这也不是一种清晰且有文档记录的代码编写方式,而只是一种尝试和错误。@Sourav_Agasti是对SSAS引擎某些内部工作的最佳参考(至少在2005年和2008年,但可能没有太大变化)可以在Mosha的博客中找到一些片段:@FrankPl你可以将这三条评论移到答案中?你有任何参考或例子表明相同吗?编辑了我的答案,因为答案太长了