Optimisation des scripts de calcul Essbase à l'aide de NOT dans les instructions IF

Dans les scripts de calcul Oracle Essbase, l'instruction if permet d'exécuter le code si une condition est vraie, tandis que les instructions else et else if permettent d'indiquer chaque nouvelle condition à tester si la condition évaluée précédemment est fausse.

Vous pouvez optimiser le code qui utilise les instructions if et else if en analysant la condition à laquelle répondent la plupart de vos données et en déplaçant ensuite l'évaluation de cette condition au début du code afin de l'exécuter le plus tôt possible.

Prenons le script de calcul suivant comme exemple pour Sample.Basic, où les dimensions de compte et de temps sont des dimensions denses :

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

Dans ce cas, plus de 90 % des données satisfont le critère de la condition else. Seulement 10 % des données environ satisfont le critère de la condition if. En raison de la fonction @prior dans la condition else, le mois de janvier doit être calculé avant tous les autres mois. Lors de l'exécution de ce calcul, le temps total écoulé est indiqué comme suit :

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

Dans ce calcul, le membre SalesYTD est calculé en mode cellule, ce qui signifie que janvier est calculé en premier quel que soit l'ordre des instructions conditionnelles if car il apparaît avant les autres mois dans l'outline.

Vous pouvez optimiser ce type de script en réorganisant les instructions et en ajoutant l'opérateur NOT à la première condition, comme illustré dans l'exemple suivant :

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

Ici, le calcul dure moins d'un quart du temps nécessaire au calcul de l'exemple précédent car plus de 90 % des données satisfont le critère de l'instruction if.

Note:

Dans cet exemple, il est impératif de calculer la formule dans l'ordre de l'outline (février doit être calculé après janvier, mars après février, etc.) pour obtenir des résultats corrects. Vous pouvez utiliser @calcmode(Cell) pour forcer l'ordre s'il n'est pas automatiquement respecté.