Нужна помощь в оптимизации многоуровневого расчета сумм DAX - PullRequest
0 голосов
/ 12 октября 2018

Я ищу совет о том, как оптимизировать многоуровневый запрос суммирования DAX.Этот очень медленный, потому что, я думаю, он работает O (n ^ 3) из-за вложенности.К сожалению, мне нужно иметь несколько уровней, потому что уровни иерархии Order> Line Order> Order Order должны быть рассчитаны по-разному.

  • Единицы должны суммироваться до уровня детализации
  • Тонеобходимо усреднить до уровня Линии
  • Это необходимо суммировать до уровня Заказа

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

    Любая помощь или совет, которые вы можете предоставить, будут очень признательны.

1 Ответ

0 голосов
/ 12 октября 2018

Очень сложно дать совет по оптимизации, не видя данных и модели данных (было бы здорово, если бы они были включены в вопрос).

Ключевой вопрос здесь заключается в том, что наличие дубликатов делает факт «единицы» неаддитивным, а это означает, что вы не можете просто свернуть его в иерархии.В результате вы вынуждены делать очень дорогой тройной цикл.

Очевидное решение - сделать «единицы» полностью аддитивными.Вы можете вычислить дедуплицированные (с поправкой на дубликаты) единицы и сохранить их фактически в виде вычисляемого столбца:

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

Здесь вы делите единицы на количество уникальных DetailIDs (обычно это будет1, но в случае дубликатов DetailID будет 2 и т. Д.).

Этот вычисленный столбец немного увеличит время загрузки ваших данных, но сэкономит много времени на запрос.Для дальнейшей оптимизации рассмотрите возможность предварительного расчета в хранилище данных.

Скорректированные Единицы являются полностью аддитивными, поэтому вы теперь просто: 1011 *

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

Он должен корректно работать на любом уровне иерархии Order> Line> Detail (если нет дополнительных проблем)не описано в вопросе), и это должно быть быстро.

...