Оптимизация подведения итогов в DAX - PullRequest
0 голосов
/ 29 мая 2018

У меня есть эта формула DAX, которая дает мне счетчик id, который появляется в таблице фактов за месяц, усредненный за год.Я могу поместить эту меру в табличное объявление, она распаковывается по строке без проблем (добавляя переменные из измерений)

Measure:= AVERAGEX(
    SUMMARIZE(
        CALCULATETABLE(fact_table;FILTER('Time_Dimension';'Time_Dimension'[Last_month] <> "LAST"));
         Time_Dimension[Month Name];
        "Count";DISTINCTCOUNT(fact_table[ID])
    );
    [Count]
)

Но это ужасно медленно (у меня есть 3 меры, как это на одной таблице) итаблица фактов большая (примерно 300 миллионов строк)

Я читал, что SUMMARIZE действительно плохо работает с агрегатами и его следует заменить на SUMMARIZECOLUMNS.Я написал эту формулу

Measure_v2:= AVERAGEX(
    SUMMARIZECOLUMNS(
        Time_Dimension[Month Name];
        FILTER(Time_Dimension;
            Time_Dimension[Month Name]<>"LAST"
        );
        "Count";DISTINCTCOUNT(fact_table[ID])
    )
    [Count]
)

И она работает, когда я визуализирую меру как она есть, но когда я пытаюсь поместить ее в контекст (как в таблице выше), она выдает мне ошибку «Не могуиспользуйте SUMMARIZECOLUMN и ADDMISSINGITEMS () в этом контексте "Как я могу сделать устойчивую оптимизацию из исходной функции SUMMARIZE?

1 Ответ

0 голосов
/ 29 мая 2018

Прежде чем оптимизировать SUMMARIZE, я бы повторно посетил общий подход.Если ваша цель - рассчитать среднее количество фактов за год-месяц, есть более простой (и более быстрый) способ.

[ID Count]:=CALCULATE(COUNT('fact_table'[ID]),'Time_Dimension'[Last_month] <> "LAST") 

[Average ID Count]:=AVERAGEX( VALUES('Time_Dimension'[Year_Month]), [ID Count`])

при условии, что:

  • у вас есть атрибут год-месяц в вашем измерении времени;
  • идентификаторы в вашей таблице фактов уникальны (и поэтому простыколичество достаточно)

Если это решение не решит вашу проблему, то, пожалуйста, опубликуйте модель данных - ее трудно оптимизировать, не зная структуры данных.

Что касается примечания, я бы удалил поле ID из таблицы фактов.Это не добавляет никакой ценности модели и потребляет огромное количество памяти.Ваша цель может быть достигнута путем простого подсчета строк:

[Fact Count]:=CALCULATE(COUNTROWS('fact_table'),'Time_Dimension'[Last_month] <> "LAST") 
...