我有一个事实表,其中包含有关公司购买和销售量的所有信息。为了创建关于f.ex保证金的som计算,我需要使用行进行购买以及销售行以获得正确的计算。
现在,我已经创建了一个计算度量,它给出了正确的结果,但是我添加到查询中的维度越多,使用此计算度量时查询运行的速度就越慢。似乎它使用了大量时间来返回我用来查找有关购买行的元组。
我正在使用元组来存储" purcase行,但元组变得非常大,因为我需要包含销售行使用的维度的所有默认成员才能使用它们。基本上,我的元组看起来像这样只有更多的维度层次结构:
(
[Dimension 1].[Hierarchy 1].&[member]
,[Dimension 1].[Hierarchy 2].&[member]
,[Dimension 2].[Hierarchy 1].&[member]
,[Dimension 3].[Hierarchy 1].&[member]
,[Dimension 4].[Hierarchy 1].&[member]
,[Measures].[Purchase Standard Cost]
)
然后我将这个元组与销售行中的一个度量相乘,得到我的结果。
任何人都有关于如何提高查询性能的任何提示?计算有效,如果我只是按几个维度进行切片就可以正常运行,性能也不差,但是我添加的越多,它就越慢,用户就会遇到性能问题。
答案 0 :(得分:2)
由于使用的维度数量增加,存储引擎必须扫描其他文件,这可能是此类性能下降的原因。
根据我的观点,我有几点建议:
" Materialise的"一些元组到物理维度(如果在MDX中没有动态,后期绑定功能等):
2.1。将相应的键(表示元组)添加到源表中。
2.2。在这些键上构建适当的尺寸。
2.3。使用这些" ex-tuples"
示例:
您有一个包含列的100M行表:SomeDate, Customer, Product, Amount
和一个单分区的度量值组。
您需要创建(2015-01-01, Customer A, Product Z, Amount)
等元组。
服务器必须扫描整个数据以获取准确的值。
SomeDate
年(+切片)添加分区后,服务器将只占用2015分区。2.1。将列Tuple_ID int添加到表中并在ETL期间映射它。
E.g。 Tuple_ID = 1 where Customer = 'Customer A' and Product = 'Product Z'
2.2。在这个新字段上创建一个维度(或在包含组合列表的附加表上创建一个维度,以便能够轻松修改逻辑)。
2.3。在计算中使用([Tuple ID].[Tuple ID].&[1],[Measures].[Amount])
。
这种技术的优点是服务器只采用预先计算的值,因此查询速度很快。