15 окт. 2010 г.

История одной оптимизации

Часть 1. Как было настроено до оптимизации

Настройки Essbase.cfg
...
CALCCACHEHIGH    200000000 
CALCCACHEDEFAULT 50000000 
CALCCACHELOW     10000000
...

Порядок измерений (песочные часы):

Dimension                    Type    Declared Size  Actual Size
=============================================
Account                          DENSE   809            785
Period                             DENSE   20               18
Currency Rates               SPARSE  6                  5
Scenario                         SPARSE  7                  6
SparseDimA                   SPARSE  8                  6
Years                             SPARSE  8                  7
Currency                        SPARSE  10                8
Version                          SPARSE  15               15
SparseDimB                  SPARSE  17                13
SparseDimC                  SPARSE  125            122
SparseDimD                  SPARSE  125            124
Entity                             SPARSE  198            196
SparseDimE                  SPARSE  199            197
SparseDimF                  SPARSE  288            144

Скрипт агрегации:
SET CACHE ALL;
SET CACHE HIGH;
SET AGGMISSG ON;
SET UPDATECALC OFF;
SET FRMLBOTTOMUP ON;
SET MSG SUMMARY;
SET LOCKBLOCK HIGH;
SET EMPTYMEMBERSETS ON;

FIX(InputValue, FY10, RUR, Work, Budget)

       CALC DIM (Account, Period, SparseDimA, SparseDimB...)

ENDFIX

Часть 2. Что получилось улучшить

1. Сделал динамическими родителей в измерениях Period и Account  +25%

      Размер блока:
  • было  Account(785) х Period(18) х 8байт =  113040
  • стало  Account(705) х Period(13) х 8байт = 73320 (~уменьшился на 30%)

    P.S. Не делайте динамическими dense элементы с комплексными формулами (есть ссылка на другой блок)

2. Изменил порядок измерений +15%:
  • Dense - от большего к меньшему
  • Sparse - от меньшего агрегируемого к большему, неагрегируемые измерения, большие плоские измерения для паралельных вычислений

Dimension                    Type    Declared Size  Actual Size
=============================================
/* Dense от большего к меньшему */
Account                          DENSE   809            705
Period                             DENSE   20               13
/* Агрегируемые */
SparseDimC                  SPARSE  125            122
SparseDimD                  SPARSE  125            124
SparseDimE                  SPARSE  199            197
SparseDimA                  SPARSE  8                  6
SparseDimB                  SPARSE  17                13
/* Прочие (неагрегируемые) измерения */
Currency Rates               SPARSE  6                  5
Scenario                         SPARSE  7                  6
Years                             SPARSE  8                  7
Currency                        SPARSE  10                8
Version                          SPARSE  15               15
/* Измерения для параллельных расчетов */
Entity                             SPARSE  198            196
SparseDimF                  SPARSE  288            144

    P.S. Измерения  SparseDimA и SparseDimB логичнее поставить выше, но на них не хватит CalcCache, поэтому эти измерения перемещены ниже
    P.S.S. Какие sparse измерения необходимо переместить вниз, а какие вверх определяется только опытным путем т.е. тестируем-тестируем-тестируем

3. Включил параллельные вычисления +40%

    SET CALCPARALLEL 4;
    SET CALCTASKDIMS 2;

4. Расчитал Calculator Cache +5%
   SparseDimC (122) х SparseDimD(124) х SparseDimE (197) х 8байт / 1024 = 23 282 кб

Изменения в essbase.cfg
...
CALCCACHEHIGH    200000000 
CALCCACHEDEFAULT 50000000 
CALCCACHELOW     25000000
...


5. Изменил скрипт агрегации +50%

SET CACHE ALL;
SET CACHE LOW; /* 25Мб */;

SET AGGMISSG ON;
SET UPDATECALC OFF;
SET FRMLBOTTOMUP ON;
SET MSG SUMMARY;
SET LOCKBLOCK HIGH;
SET EMPTYMEMBERSETS ON; 

SET CALCPARALLEL 4;
SET CALCTASKDIMS 2;
/* WaterFall agreggetion */ FIX(InputValue, FY10, RUR, Work, Budget, @RELATIVE(YearTotal,0)) /*main*/ FIX(@RELATIVE(&vEntity,0)) FIX(@RELATIVE(SparseDimA,0)) FIX(@RELATIVE(SparseDimB,0)) FIX(@RELATIVE(SparseDimC,0)) FIX(@RELATIVE(SparseDimD,0)) FIX(@RELATIVE(SparseDimE,0)) FIX(@RELATIVE(SparseDimF,0)) CALC DIM (Account); ENDFIX FIX(@DESCENDANTS(Account)) AGG(SparseDimF); ENDFIX ENDFIX /*SparseDimF*/ FIX(@DESCENDANTS(Account) @DESCENDANTS(SparseDimF)) AGG(SparseDimE); ENDFIX ENDFIX /*SparseDimD*/ FIX(@DESCENDANTS(Account) @DESCENDANTS(SparseDimF) @DESCENDANTS(SparseDimE)) AGG(SparseDimD); ENDFIX ENDFIX /*SparseDimC*/ FIX(@DESCENDANTS(Account) @DESCENDANTS(SparseDimF) @DESCENDANTS(SparseDimE) @DESCENDANTS(SparseDimD)) AGG(SparseDimC); ENDFIX ENDFIX /*SparseDimB*/ FIX(@DESCENDANTS(Account) @DESCENDANTS(SparseDimF) @DESCENDANTS(SparseDimE) @DESCENDANTS(SparseDimD) @DESCENDANTS(SparseDimC)) AGG(SparseDimB); ENDFIX ENDFIX /*SparseDimA*/ FIX(@DESCENDANTS(Account) @DESCENDANTS(SparseDimF) @DESCENDANTS(SparseDimE) @DESCENDANTS(SparseDimD) @DESCENDANTS(SparseDimC) @DESCENDANTS(SparseDimB)) AGG(SparseDimA); ENDFIX ENDFIX /*Entity*/ FIX(@DESCENDANTS(Account) @DESCENDANTS(SparseDimF) @DESCENDANTS(SparseDimE) @DESCENDANTS(SparseDimD) @DESCENDANTS(SparseDimC) @DESCENDANTS(SparseDimB) @DESCENDANTS(SparseDimA)) @IDESCENDANTS(&vEntity, -1); @ANCESTORS(&vEntity); ENDFIX ENDFIX /*main*/

Часть 3. Не забываем про стандартные рекомендации

    - ACR (Average clustering Rate) должен стремится к  1, для этого запускайте dense реструктуризацию
    - Размер блока должен быть между 10 и 100KB (может быть больше для 64 bit essbase)
    - Data cache должен быть около 12.5% от общего размера pag файлов
    - Index cache должен быть таким же как ind файлы
    - В одном приложение только 1 куб

Комментариев нет:

Отправить комментарий