Otimização de Scripts de Cálculo do Essbase ao Usar NOT em Instruções IF

Em scripts de cálculo do Oracle Essbase, você usa a instrução if para executar código se uma condição for verdadeira, as instruções else e else if para especificar cada nova condição a fim de testar se a condição avaliada anteriormente era falsa.

Você pode otimizar o código que usa as instruções if e else if analisando a condição que atende à maioria dos seus dados e, em seguida, movendo a avaliação dessa condição para o início do código para que ele seja executado o mais cedo possível.

Considere o seguinte exemplo de Script de Cálculo para Sample.Basic, em que Contas e Hora são densas:

SET UPDATECALC  OFF;
"SalesYTD"(
    IF(@ismbr("Jan"))
        SalesYTD" = "Sales";
Else
        "SalesYTD"="Sales" + @prior("SalesYTD");
Endif
)

Nesse caso, mais de 90% dos dados atendem ao critério da condição else. Somente 10% dos dados atende ao critério da condição if. Em razão da função @prior na condição else, Janeiro deve ser calculado antes de todos os outros meses. Ao executar esse cálculo, o tempo total decorrido é relatado como:

Total Calc Elapsed Time for [IF.csc] : [0.203] seconds

Nesse cálculo, observe que o membro "SalesYTD" é calculado no modo Célula, o que significa que Janeiro, porque aparece antes de outros meses no outline, é calculado primeiro, independentemente da ordem das instruções condicionais if.

É possível otimizar tais scripts ao reordenar as instruções e adicionar um operador NOT à primeira condição, como mostrado neste exemplo:

SET UPDATECALC  OFF;
"SalesYTD"(
    IF(NOT(@ismbr("Jan")))
        "SalesYTD" = "Sales" + @prior("SalesYTD");
Else
        "SalesYTD"="Sales";
Endif
)

O cálculo, nesse caso, leva menos de 15 minutos em comparação com o exemplo anterior, pois mais de 90% dos dados atendem ao critério na instrução if.

Note:

Neste exemplo, é imperativo calcular a fórmula na ordem do outline (Fevereiro deve ser calculado após Janeiro, Março após Fevereiro e assim por diante) para se obter os resultados corretos. Você pode usar @calcmode(Cell) para forçar a ordem se isso não acontecer automaticamente.