需要帮助优化多层次DAX摘要计算

时间:2018-10-12 00:05:32

标签: sql powerbi dax ssas-tabular

我正在寻找有关如何优化多级DAX摘要查询的建议。这是非常慢的,因为我认为由于嵌套,它正在运行O(n ^ 3)。不幸的是,我需要几个级别,因为层次结构“订单”>“订单行”>“订单明细”需要以不同的方式计算。

  • 单位需要汇总到详细级别
  • 这需要平均到线路水平
  • 这需要汇总到订单级别

    SUMX(
        SUMMARIZE(
             'FACT Opportunity'
            ,Opportunity[LineId]
            ,"Units"
            ,AVERAGEX(
                SUMMARIZE(
                    'FACT Opportunity'
                    ,Opportunity[DetailId]
                    ,"SumDetail"
                    ,SUM('FACT Opportunity'[Units])
                    )
                ,[SumDetail]
                )
        )
        ,[Units]
    )
    

    非常感谢您提供的帮助或建议。

1 个答案:

答案 0 :(得分:1)

很难在不看到数据和数据模型的情况下提供优化建议(如果将它们包含在问题中,那将是很好的选择)。

这里的关键问题是重复项的存在使事实“单元”成为不可加性的,这意味着您不能简单地将其汇总到层次结构中。结果,您不得不执行非常昂贵的三重循环。

然后一个明显的解决方案是使“ Units”完全加法。您可以计算重复数据删除(针对重复数据进行调整)的单位,并将其存储在事实上的机会中,作为计算列:

Adjusted  Units =
DIVIDE (
    'FACT Opportunity'[Units],
    CALCULATE ( COUNT ( 'FACT Opportunity'[DetailId] ) )
)

在这里,将单位除以唯一的DetailID的数量(通常为1,但是如果重复的DetailID为2,依此类推)。

此计算列将稍微增加您的数据加载时间,但节省了大量查询时间。为了进一步优化,请考虑在数据仓库中对其进行预先计算。

调整后的单位是完全可加的,因此您现在很简单:

Total Units = SUM('FACT Opportunity'[Adjusted Units])

它应该可以在“订单”>“行”>“详细信息”层次结构的任何级别上正常工作(除非存在问题中未描述的其他问题),并且它应该很快。