2014-10-16 4 views
2

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

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

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

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

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

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

Я пробовал:

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

Я не уверен в решении, но планирую начать играть с PowerPivot в ближайшее время на работе - вы используете xl 32bit или 64bit? Что вы используете для обработки этих данных? – whytheq

+0

Мы не используем PowerPivot - мы используем службы анализа SQL Server в табличном режиме (что в основном одно и то же, но развернуто в серверной среде). Сервер, о котором идет речь, имеет 32 ГБ оперативной памяти, что достаточно для этой модели, которая занимает всего около 1 ГБ памяти после ее обработки. – Dan

+0

Создает отдельное измерение с именем TopCustomers? Предварительно подсчитав клиентов верхнего уровня по вашему расчетному столбцу в вашем ETL, а затем используя это как ваши ROWS в запросах Excel/MDX и ваши меры в столбцах? Если вы не можете достичь хорошей производительности, как вы говорите выше, с вашим оборудованием, создание измерения с помощью TopCustomers может быть лучшим способом ... – Mez

ответ

1

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

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

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

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