Эффективное отображение верхней 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 (например, текущий месяц, конкретный продукт и т. Д.) Я наблюдал значительное увеличение производительности. Решение, в моем случае, состоит в том, чтобы научить моих пользователей всегда фильтровать свои данные, прежде чем включать измерение клиента в свои сводные таблицы.