
Кирилл Паршин
Ведущий консультант, департамент EPM «КОРУС Консалтинг»
Многомерные базы данных (MDB) — это незаметные, но критически важные механизмы практически всех систем корпоративного управления эффективностью (EPM): Oracle EPM Cloud и Essbase, IBM Planning Analytics (TM1), Anaplan, Microsoft SSAS, Optimacros и многих других. Именно они лежат в основе бюджетирования, прогнозирования, моделей прибыльности и управленческой отчетности, позволяя анализировать показатели в разрезе времени (периодов), бизнес‑подразделений (организаций), продуктов, сценариев, версий и иных измерений. При этом, несмотря на огромную аналитическую мощность, MDB чрезвычайно чувствительны к архитектуре. Разница между кубом (MDB), который отвечает мгновенно, и кубом, который «думает» минутами, чаще всего определяется не железом и не ПО, а тем, как он спроектирован.
В своей основе MDB переводят сложную реальность бизнеса в формализованные измерения, иерархии и элементы. Каждое измерение — время, организация, счет, продукт, сценарий — добавляет гибкости анализа, но одновременно экспоненциально увеличивает сложность. Каждый новый элемент или узел иерархии умножает количество потенциальных пересечений данных. Большинство из них останутся пустыми, но все равно будут потреблять ресурсы хранения, расчетов и обработки запросов. Поэтому хорошая размерностная модель — это не просто вопрос структуры, а фундамент производительности.
Меня зовут Кирилл Паршин, я ведущий консультант в департаменте EPM «КОРУС Консалтинг». Эта статья посвящена архитектурным аспектам производительности многомерных баз данных: как количество и состав измерений влияют на объем, как иерархии и агрегации нагружают систему, и почему стратегии выборки и расчетов могут либо ускорить модель, либо сделать ее неработоспособной. Это не разбор конкретной технологии — здесь собраны универсальные принципы, одинаково применимые к Essbase, TM1, Anaplan, SSAS, Optimacros и другим MDB‑движкам.
Цель проста: показать, что производительность нельзя «докрутить» в конце — ее нужно заложить на этапе проектирования. Понимая, как измерения, срезы данных и расчеты взаимодействуют на архитектурном уровне, EPM-специалисты могут строить кубы, которые не только корректно отражают бизнес‑логику, но и выдают результаты с такой скоростью, которую ожидают пользователи.

Производительность размерностной архитектуры: почему структура определяет скорость
Сила многомерных баз данных в том, что они позволяют смотреть на одни и те же данные под разными углами: по времени, бизнес‑подразделениям, продуктам, сценариям, версиям т.д. Однако, каждая дополнительная ось анализа имеет цену. Каждое измерение умножает количество возможных пересечений в кубе — а значит, объем данных, которые нужно хранить, агрегировать, рассчитывать или просматривать при запросах. Производительность начинается не с оптимизации скриптов и не с серверов, а с дизайна измерений.
Как измерения формируют объем куба
Каждое добавленное измерение увеличивает размер куба на количество содержащихся в нем элементов. Формула проста:
Общее число потенциальных ячеек = произведение количества элементов всех измерений
Пример простой модели:
· 12 месяцев
· 3 сценария (Факт, Бюджет, Прогноз)
· 10 организаций
· 50 счетов
Итого: 12 × 3 × 10 × 50 = 18 000 ячеек
Выглядит вполне приемлемо. Однако посмотрим, что произойдёт при расширении количества элементов измерений:
· Добавляем 20 продуктов → 18 000 × 20 = 360 000
· Добавляем 100 клиентов → 360 000 × 100 = 36 000 000
Никакой новой логики, никаких новых расчетов — но модель выросла с 18 тысяч до 36 миллионов потенциальных пересечений. В этом и состоит суть многомерного моделирования: каждое измерение — это множитель.
Даже если куб разреженный и большинство ячеек пусты, движок все равно должен учитывать их при размещении данных, расчётах и запросах — особенно в классических OLAP‑платформах.
Элементы измерений: скрытые множители
Важно не только количество измерений, но и количество элементов внутри них. Один новый элемент может показаться незначительным, однако его влияние на объём модели часто недооценивают.
Если остальные измерения в совокупности формируют 1 000 000 возможных пересечений, то добавление всего одного элемента приводит к появлению ещё одного миллиона потенциальных ячеек.
Именно поэтому высококардинальные измерения (Продукты, SKU, Клиенты, ЦФО) требуют особой осторожности — особенно в случаях, когда они пересекаются с другими крупными измерениями.
При этом важно помнить, что в EPM-системах уровень детализации измерений осознанно ниже, чем в учетных системах. Упрощение модели — не недостаток, а одна из ключевых целей планирования: оно позволяет сосредоточиться на управляемых показателях и обеспечивает приемлемую производительность.
Иерархии: больше гибкости — больше агрегаций
Иерархии позволяют агрегировать данные, но каждая из них имеет цену:
· Каждый родительский элемент требует агрегации
· Глубокие и широкие иерархии создают множество путей агрегации
· Альтернативные иерархии умножают объём работы;
· Shared‑элементы удобны, но ресурсозатратны по вычислениям.
Давайте рассмотрим на простом примере:
· 10 000 продуктов
· 2 альтернативные иерархии
· 5 уровней иерархии
Только по измерению «Продукт»: 10 000 × 2 × 5 = 100 000 операций агрегации
И это ещё до учёта Времени, Сценариев, Организаций и Счетов.
Иерархии необходимы — но они не бесплатны.
Разреженность: невидимый враг
Реальные кубы на 90–99% пусты — и это нормально. Проблема возникает, когда пустых ячеек слишком много.
Избыточная разреженность приводит к:
· Росту объёма хранения
· Увеличению времени расчётов
· Медленным запросам
· Повышенному потреблению памяти
· Неэффективной работе блоков данных.
Разреженность нельзя устранить полностью, но ее можно контролировать архитектурой — в том числе правильным выбором плотных и разреженных измерений с учётом конкретной платформы.
Ключевой принцип: сначала структура, потом скорость
Большинство проблем с производительностью возникают из‑за неоптимальных архитектурных решений:
· Измерения «на будущее»
· Неконтролируемый рост количества элементов измерений
· Избыточные альтернативные иерархии
· Пересечение больших измерений со всеми остальными
· Игнорирование разреженности.
MDB‑движки очень быстры — если архитектура дает им шанс.
Производительность выборки и отображения: почему пользователи ждут
Даже огромный куб может быть быстрым, если пользователь работает с маленькими срезами. И наоборот — небольшой куб может быть мучительно медленным, если каждый запрос пытается охватить половину модели.
Золотое правило: показывайте только нужный срез
Запрос 8 000 продуктов, 5 000 клиентов, 200 регионов, 12 месяцев и 300 счетов дает до 2,88 триллиона потенциальных пересечений. Даже если почти все пусто, движок должен пройти по структурам измерений. Запрос ко всем элементам измерения — одна из главных причин медленных отчетов.
Делите отчеты: маленькие таблицы всегда быстрее
Большие формы редко дают пользователю больше ценности, но почти всегда замедляют систему. Меньшие, сфокусированные представления обычно выигрывают и по скорости, и по удобству.
Избегайте пустых комбинаций
Фильтры по допустимым пересечениям, атрибутам и non‑empty‑логике позволяют извлекать только реальные данные и резко ускоряют работу.
Учитывайте ограничения фронтенда
Даже если куб отвечает мгновенно, браузер или Excel могут «упасть» при отрисовке больших объёмов данных. Производительность — это не только сервер, но и клиент.
Производительность расчетов: как логика определяет скорость
Расчеты должны затрагивать минимально необходимый объем данных. Самый быстрый расчет — тот, который не выполняется там, где он не нужен.
Считайте только нужный срез
Стоимость расчёта прямо пропорциональна числу затронутых пересечений.
Необходимо стараться максимально возможно ограничивать срез выполняемого расчета.
Не считайте по пустоте
Расчеты по пустым областям — один из самых скрытых и дорогих источников замедлений, ведь, как вы можете помнить — реальные кубы пусты на 90–99%, таким образом исключая пустоты из вычислений затраты ресурсов уменьшаются на такую же величину.
Push‑логика быстрее Pull‑логики
Начинайте расчеты от существующих данных, а не обходите всё пространство куба в поиске значений. Здесь важно учитывать не только исключение пустых входных данных из расчетов, но и исключение заведомо пустых результатов.
Например, маржинальность имеет смысл рассчитывать только по тем комбинациям, где существует выручка. В этом случае расчет выполняется от выручки (Push-подход), а не по всем потенциальным пересечениям измерений.
Push vs Pull — простой пример
Предположим, в модели имеется:
· 5 продуктов
· 5 клиентов
· 10 регионов
· Продажи существуют только для 5 валидных комбинаций
Pull-подход:
Расчет выполняется по всем возможным комбинациям:
5 × 5 × 10 = 250 пересечений
Push-подход:
Расчет выполняется только там, где есть данные:
→ 5 пересечений
Разница: 50×. При росте модели каждое новое измерение умножает объем расчетов, тогда как Push-логика масштабируется только по фактическим данным.
Избегайте широких кросс‑размерных ссылок
Чем шире область, тем выше цена. Всегда сужайте контекст.
Инкрементальные расчёты вместо полных
Пересчитывайте только то, что изменилось. Полный пересчет — редкое исключение.
Следует отметить, что в разных MDB-системах доступный функционал для реализации данных принципов может существенно различаться. При проектировании MDB-модели важно опираться на возможности и ограничения конкретной системы.
Итог: 10 принципов производительной архитектуры MDB
1.Создавайте только действительно нужные измерения
2. Контролируйте детализацию
3. Используйте иерархии осознанно
4. Минимизируйте пустые пересечения
5. Извлекайте только нужные срезы
6. Проектируйте отчеты под реальные данные
7. Считайте только необходимое
8. Избегайте расчетов по пустым ячейкам
9. Предпочитайте push‑логику
10. Используйте инкрементальные пересчеты
Главный вывод: производительность — это не настройка, а дисциплина моделирования. Хорошая архитектура делает технологии быстрыми. Плохая — не спасается ничем.
