HFM Performаnсе Rules

Несколько простых правил, позволяющие повысить скорость расчетов

q. Как отлаживать скрипт

a. С помощью вывода в спец. файл

Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objLogFile = objFSO.OpenTextFile(“D:\Hyperion\logs\XX_HFM_LOGS\calc_q_rev_month_adj” & _
HS.Parent.Member & “_” & HS.Entity.Member & “_” & HS.Period.Member & “.log”,8,True)
objLogFile.WriteLine “Начало работы CalcQRevMonthAdj ” & Now()
objLogFile.WriteLine ”  HS.Value.Member = ” & HS.Value.Member
objLogFile.WriteLine ”  HS.Entity.Member = ” & HS.Entity.Member
objLogFile.WriteLine ”  HS.Period.Member = ” & HS.Period.Member
objLogFile.WriteLine ”  HS.Year.Member = ” & HS.Year.Member
objLogFile.WriteLine ”  HS.Scenario.Member = ” & HS.Scenario.Member

objLogFile.WriteLine “Окончание работы CalcQRevMonthAdj ” & Now()

objLogFile.WriteLine ” ”
objLogFile.Close ‘Закрытие Лога

Q. Как повысить производительность расчета

А.

1) проверять на 0 (ноль) при чтении и записи данных

2) округлять значения (не работать с очень маленькими цифрами )

Данное утверждение хорошо иллюстрируется примером

После считывания строчки данных

Call objDU.GetItem(intCurItem, strAcct, strICP, strCust1, strCust2, strCust3, strCust4, dblData)

Округляем

dblData = Round (dblData,6)

проверяем на 0 и работаем дальше

if dblData <> 0 then

HS.SetDataWithPOV strPov, dblData,True

end if

3) при использовании OpenDataUnit нужно избегать открытие слишком больших массивов (более 100000 строк) и множество (более 100 в цикле) маленьких массивов (менее 1000 строк), так как открытие OpenDataUnit является ресурсоемкой операцией.

4) при выборе параметров для внешнего цикла нужно руководствоваться следующим правилом

– если требуется расчет по нескольким статьям, то выбирается в точку среза для OpenDataUnit та, которая максимально репрезентативна и присутствует во всех срезах, например Объем продаж VS Статьи Себестоимости продаж, выбирается Объем продаж , так как он существует для любой из статей СС

5) Если требуется ограничить выборку OpenDataUnit определенным набором множества элементов, то это можно сделать используя в POV выражения выборки листа A{TotalRev.[Base]}.C1{C1Top.[Base]}.C2{MyC2List}

6) Нельзя использовать несколько вложенных циклов, критичным на производительность является наличие в правиле более двух циклов. Если вдруг нужно больше чем два цикла, и используется OpenDataUnit , его нужно расширить более гибким условием, что бы в выборку попадали все требуемые значения (это можно сделать с помощью выражений по выборке множеств {TotalRev.[Base]} и альтернативных иерархий)

7) Можно использовать альтернативный способ (который чреват увеличением размера БД) расчетов можно произвести с помощью пользовательских направлений Custom1..4 и иерархий с разделяемыми направлениями задействуя стандартную агрегации на направлениях, (на которых заполняем элементы с помощью HS.EXP)

8) Следить за тем, что бы в цикле не было присваивание констант или расчетов, которые не зависят от контекста выполнения цикла

9) При использовании HS.EXP пользоваться округлением с помощью HS.ROUND

10) крайне осторожное использование HS.EXP внутри циклов

11) Контролировать кол-во срезов в выражении HS.EXP – нужно явно указывать не менее 3-х POV. Например

aryCostAccPlList = HS.Account.List(“AP0200000″,”[Base]”)
aryRD = HS.Custom3.List(“SG00002″,”[Base]”)
For Each CurrPLAccount In aryCostAccPlList
For Each CurrRD In aryRD
strExp = “A#” & CurrPLAccount & “.C2#ADJC025.C3#” & CurrRD & “.C4#[None] = A#” & CurrPLAccount & “.C2#ADSYC96.C3#” & CurrRD & “.C4#[None] – A#” & CurrPLAccount & “.C2#GAAP_INPUT.C3#” & CurrRD & “.C4#[None]”
HS.Exp strExp
next
next
Hs.Exp “A#GM Pct= A#GM / A#Sales”
12) Основные ошибки
  • Это правило в цикле будет работать по всем возможным комбинациям и будет рассчитано на срезах, где существуют данные.
Hs.Exp “A#GM Pct= A#GM / A#Sales”

  • Это правило в цикле будет работать по всем возможным комбинациям в направлении ICP по другим элементам оно будет брать значение None, None, None, None. Поэтому максимальное число расчтов не превысит значения в 40 записей.

Hs.Exp “A#GM Pct.C1#[None] .C2#[None] .C3#[None] .C4#[None] = A#GM / A#Sales”


  • Это очень неэффективное правила. Они запишут по 80 млн записей

Hs.Exp “A#GM Pct = A#GM.C1#[None] .C2#[None] .C3#[None] .C4#[None] + A#Sales C1#[None] .C2#[None] .C3#[None] .C4#[None]”

Hs.Exp “A#GM Pct = 1”
  • Данное правило содержит в своей левой стороне ссылку до конкретной ячейки, поэтому оно изменит одну запись.

Hs.Exp “A#GM Pct.I#[ICP None].C1#[None] .C2#[None] .C3#[None] .C4#[None] = A#GM.I#[ICP None].C1#[None] .C2#[None] .C3#[None] .C4#[None] / A#Sales. I#[ICP None]. C1#[None] .C2#[None] .C3#[None] .C4#[None]”