Эффективное отображение верхней N в сводной таблице Excel из табличной модели SSAS

У меня есть простая табличная модель, состоящая из таблицы фактов с ок. 20 млн. записи (транзакции продаж) и таблица измерений с приблизительно 600 000 записей (клиентов).

Типичный сценарий отчетности заключается в том, чтобы получить 10 лучших клиентов по некоторым показателям в таблице фактов, возможно, отфильтрованных по некоторым другим критериям (обычно по периоду времени, продукту и т. Д.).

В Excel агрегирует все 20 млн. Записи о возврате общей суммы продаж являются мгновенными. Однако, как только я пытаюсь сгруппировать по клиентам, требуется некоторое время (15-20 секунд) для извлечения всех данных, что имеет смысл, так как есть достаточно много клиентов (600 000), которые необходимо отобразить.

Теперь, если я применяю фильтр значений в Excel, чтобы получить только 10 лучших клиентов, для возврата результата все равно требуется около 15-20 секунд, что недопустимо для моих пользователей (поскольку они хотели бы мгновенно увидеть 10 лучших клиентов). при нарезке на другие атрибуты, такие как продукт, время и т. д.).

Внутренне Excel использует TOPCOUNT MDX-функция при запросе табличной модели с помощью фильтра значений.

Что я могу сделать в табличной модели, чтобы ускорить такие запросы?

Я пробовал:

  • Создание вычисляемого столбца в таблице измерений, содержащего общую сумму продаж для каждого клиента. Хотя производительность выше, это не тот путь, потому что значения в этом столбце не могут быть разрезаны другими атрибутами из фактов, и столбец, очевидно, в конечном итоге содержит много различных значений (что плохо в табличной форме).
  • Создание рассчитанной меры на таблице фактов с использованием DAX RANKX Функция, как предлагается здесь. Это вызвало сбой моего экземпляра Tabular (слишком много записей в таблице измерений?)
  • Выполнение простого оператора DAX непосредственно в табличной модели с использованием DAX TOPN функция. Это было даже медленнее, чем TOPCOUNT MDX-подход, в 3-4 раза.

1 ответ

Решение

После еще одного поиска в Интернете и выполнения дополнительных тестов я пришел к выводу, что SSAS Tabular по своей сути плохо отвечает на запросы типа TOPCOUNT/RANK в нефильтрованном контексте. Причина кажется довольно простой:

Если у меня есть измерение, содержащее 600000 клиентов, и я запрашиваю топ-10 по сумме продаж в нефильтрованном контексте, табличному движку необходимо вычислить сумму суммы продаж для каждого отдельного клиента, прежде чем можно будет сортировать и возвращать топ-10. или ранг каждого клиента.

В многомерном OLAP данные обычно предварительно агрегируются на pr. уровень клиента, что означает, что многомерный куб может отвечать на такие запросы гораздо быстрее.

При применении одного или нескольких фильтров в табличной форме SSAS (например, текущий месяц, конкретный продукт и т. Д.) Я наблюдал значительное увеличение производительности. Решение, в моем случае, состоит в том, чтобы научить моих пользователей всегда фильтровать свои данные, прежде чем включать измерение клиента в свои сводные таблицы.

Другие вопросы по тегам