Несколько простых правил, позволяющие повысить скорость расчетов
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.MemberobjLogFile.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 aryCostAccPlListFor Each CurrRD In aryRDstrExp = “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 strExpnextnextHs.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]”