1. Очищаем куб Sample.Basic и смотрим количество существующих блоков:
2. Вводим число 1.
3. Меняем 1 на #Missing
4. Смотрим количество существующих блоков:
- Existing level 0 blocks - 1
- Existing upper-level blocks - 0
SET AGGMISSG ON;
CALC ALL;
6. Смотрим количество существующих блоков:
- Existing level 0 blocks - 1
- Existing upper-level blocks - 8!!!
Вывод - независимо от того есть ли данные в какой-либо ячейке или нет Essbase агрегирует данные (создает блоки верхнего уровня), что приводит к увеличению времени расчета и увеличению размера БД.
Что делать - удалить пусты блоки можно командой "CLEARBLOCK Empty;"
Как еще бороться с ненужными данными:
- Удаляйте нули (часто пользователи вместо #Missing вносят "0")
- Правильно удаляйте ненужные срезы командами CLEARBLOCK или CLEARDATA (не фиксируйте плотные элементы).
- Выгружайте нулевой срез в реляционную таблицу и анализируйте данные (часто много ненужных цифр залипают на Begbalance, архивных статьях и т.д.)
P.S. Еще один пример скрипта и его краткого лога, где агрегация работает неэффективно
/* параметр логировая */ SET MSG SUMMARY; /* удаляем все блоки*/ CLEARBLOCK ALL; /* создаем один блок c Jan = 100*/ SET CREATENONMISSINGBLK ON; FIX ("New York", "100-10", "Sales", "Actual") "Jan" = 100; ENDFIX SET CREATENONMISSINGBLK OFF; /* агрегируем Feb */ SET AGGMISSG ON; FIX ("Feb") CALC DIM ("Measures", "Product", "Market", "Scenario"); ENDFIX
/* удалили */ Clearing all data blocks from [(ALL)] partition Removed [9] data blocks /* создали один блок */ Calculating [ Year(Jan)] with fixed members [Sales; 100-10; New York; Actual] Create Blocks on Equations: [Enabled] Create Non #Missing Blocks: [Enabled] Total Block Created: [1.0000e+000] Blocks /* создали 7 блоков */ Calculating [ Measures, Scenario, Product, Market, with fixed members [Year(Feb)] Aggregate #Missing values: [Enabled] Total Block Created: [7.0000e+000] BlocksЯ сделал запись в Jan, а агрегировал по Feb - все равно блоки создаются. Это конечно же не ошибка, а особенность работы Essbase, которую надо учитывать.
Есть ещё полезная штука, которую лучше использовать по умолчанию
ОтветитьУдалитьSET AGGMISSG ON;
или же можно прописать сразу в essbase.cfg
AGGMISSG указывает Essbase как консолидировать данные.
ОтветитьУдалитьЕсли мы установим параметр в ON - Essbase всегда будет консолировать данные с детей на родителя.
Если мы установим парамер в OFF - Essbase не консолидирует #Missing, но это приводит к падению произвдительности на 10-20% (т.к. тратится дополнительно время на проверку значений) и зависанию сумм на родителях.
SET AGGMISSG OFF;
calc all;
* Existing level 0 blocks - 1
* Existing upper-level blocks - 2!!!
т.е. в данном случае получается выигрыш по кол-во блоков верхнего уровня :)
Я добавлю SET AGGMISSG ON; в скрипт агрегации, чтобы не смущать других читателей.
Спасибо за замечание.