10 нояб. 2010 г.

Берегись пустых блоков

Агрегирует ли Essbase пустые блоки? Сейчас узнаем.

1. Очищаем куб Sample.Basic и смотрим количество существующих блоков:
2. Вводим число 1.
3. Меняем 1 на #Missing
4. Смотрим количество существующих блоков:
  • Existing level 0 blocks - 1
  • Existing upper-level blocks - 0
5. Запускаем скрипт агрегации:

     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, которую надо учитывать.

2 комментария:

  1. Есть ещё полезная штука, которую лучше использовать по умолчанию
    SET AGGMISSG ON;
    или же можно прописать сразу в essbase.cfg

    ОтветитьУдалить
  2. 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; в скрипт агрегации, чтобы не смущать других читателей.

    Спасибо за замечание.

    ОтветитьУдалить