元组的缓慢计算度量

Slow calculated measure with tuple

我有一个事实 table,它包含有关一家公司买卖多少的所有信息。为了创建关于 f.ex 保证金的 som 计算,我需要使用购买行和销售行来获得正确的计算。

现在,我创建了一个计算量度,它给出了正确的结果,但是我添加到查询中的维度越多,使用这个计算量度时查询运行的速度就越慢。 return 我用来查找有关购买的行的元组似乎花费了很多时间。

我将元组用于 "store" 采购行,但元组变得非常大,因为我需要包括销售行使用的维度的所有默认成员,以便使用它们。基本上我的元组看起来像这样,只是具有更多维度层次结构:

(
        [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]
    )

然后我将这个元组与销售行中的度量相乘,得到我的结果。

有人对如何提高查询性能有任何建议吗?计算有效,如果我只按几个维度进行切片,它工作得很好,性能也不错,但我添加的越多,速度越慢,用户会遇到性能问题。

由于使用的维度数量增加,存储引擎必须扫描额外的文件,这可能是这种性能下降的原因。

从我的角度来看,根据它们的有效性,我有几个建议:

  1. 实施分区(如果尚未实施)以扫描较少的数据量。
  2. "Materialize"一些元组到物理维度(如果MDX中没有动态,后期绑定函数等):

    2.1。将代表元组的相应键添加到您的源 tables.

    2.2。在这些键上构建适当的维度。

    2.3。使用这些 "ex-tuples".

  3. 的计算度量

示例:

您有 1 亿行 table,列为:SomeDate, Customer, Product, Amount 和一个单分区度量值组。

您需要创建像 (2015-01-01, Customer A, Product Z, Amount) 这样的元组。

服务器必须扫描整个数据以获取精确值。

  1. SomeDate 年(+切片)添加分区后,服务器将只占用 2015 个分区。

2.1。将列 Tuple_ID int 添加到 table 并在 ETL 期间映射它。

例如Tuple_ID = 1 where Customer = 'Customer A' and Product = 'Product Z'

2.2。在这个新字段上创建一个维度(或在附加 table 上创建一个带有组合列表的维度,以便能够轻松修改逻辑)。

2.3。在计算中使用([Tuple ID].[Tuple ID].&[1],[Measures].[Amount])

这种技术的优点是服务器只接受预先计算的值,因此查询速度快。