(столбчатая диаграмма) максимальное количество открытых сеансов приложений в одну минуту при выбранном разрезе год/месяц/день/час/минута.
Вводные:
Есть таблица на SQL, в которую записывается информация о сеансах пользователей 1С в компании. В ней около 15 столбцов с информацией о приложении, сервере или пользователе (они будут использоваться как фильтры в отчете, в расчетах не участвуют). Главные столбцы, которые я использую в своей задаче это идентификатор сеанса, дата-время начала и окончания. На текущий момент в этой таблице несколько сотен тысяч строк за 3 месяца.
Проблемы с которыми я столкнулась:
1) Не меняя формата исходной таблицы загрузила её в модель. Создала вычисляемый календарь со временем (точность до минуты) - без него корректно не работала ось в графике. календарь НЕ связывала с данными. Этот календарь использовала в оси и в фильтре.
Сделала меру, чтобы просто посчитать кол-во сеансов.
CALCULATE(
DISTINCTCOUNT('Сеансы'[id]),
FILTER('Сеансы', [Время начала] <= MAX('_Календарь + время'[ДатаВремя]) && [Время окончания] >= MIN('_Календарь + время'[ДатаВремя]) )
)
Далее создала меру для расчета максимального кол-ва сеансов в минуту в выбранном периоде (год/месяц/день/час/минута):
VAR ByMinutes =
SUMMARIZE(
'_Календарь + время',
[ДатаВремя],
"Sessions",
[Кол-во сеансов])
VAR Test_Maxx =
MAXX(
ByMinutes,
[Sessions])
RETURN
Test_Maxx
Дело в том, что эти меры считают правильно и сохраняют возможность фильтрации данных, но отрабатывают крайне долго.
Возможно ли оптимизировать эти меры?
2) Пробовала пойти другим путем и через PQ развернуть время работы поминутно в строки и связать это с календарем - в первый раз развернулось в 523 млн записей (до самой меры так и не дошла), а во все следующие - запрос даже не прогрузился из-за нехватки памяти((
В общем, буду рада любым идеям по оптимизации этой задачки☀️
1. Сумма сеансов = VAR _min = MIN( '_Календарь + время'[ДатаВремя] ) VAR _max = MAX('_Календарь + время'[ДатаВремя] ) RETURN CALCULATE( SUMX( VALUES( 'Сеансы (по минутам)'[id] ); 1 ); 'Сеансы'[Время начала] <= _max && 'Сеансы'[Время окончания] >= _min ) 2. Сеансов в минуту v2 = MAXX( VALUES( '_Календарь + время'[ДатаВремя] ); [Сумма сеансов] )
1 шаг, простой. Никогда не используйте в summarize конструкцию, которая вычисляет поля. используйте связку adddcolums + summarize. 2 шаг Иногда связка sumx( distinct() , 1) работает быстрее distintcount (зависит от данных). Попробуйте замерить в dax studio. 3 шаг, сложный Таблицы Дата + время убийцы производительности. Читайте про cardinality В вашем случае стоит сделать 2 таблицы. Обычную календарь + таблицу времени. В таблице фактов так же разбить на 2 столбца, дата отдельно и время. Сделать связи (физическая связь самое быстрое, что есть в PBI) После этого должно наступить счастье и радость.
Сразу скажу, это без наезда) Я просто не поняла, как они тут будут работать в связке
https://radacad.com/how-to-use-time-and-date-dimensions-in-a-power-bi-model Почитайте все же про разделение столбцов. Связи можете не делать, никто не заставляет.
Обсуждают сегодня