Ottimizzazione degli script di calcolo di Essbase utilizzando NOT in istruzioni IF

Negli script di calcolo di Oracle Essbase viene utilizzata l'istruzione if per eseguire il codice se una condizione è vera. Vengono utilizzate invece le istruzioni else ed else if per specificare ogni nuova condizione da sottoporre a test se la condizione valutata precedentemente è falsa.

È possibile ottimizzare il codice che utilizza le istruzioni if ed else if analizzando la condizione che soddisfa la maggior parte dei dati e spostando la valutazione di tale condizione all'inizio del codice, in modo che venga eseguita il prima possibile.

Esaminare l'esempio di script di calcolo per Sample.Basic riportato di seguito, dove Accounts e Time sono dimensioni dense.

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

In questo caso, oltre il 90% dei dati soddisfa il criterio della condizione else. Solo il 10% dei dati soddisfa il criterio della condizione if. A causa della funzione @prior nella condizione else, gennaio (Jan) deve essere calcolato prima di tutti gli altri mesi. Nell'esecuzione del calcolo, il tempo trascorso totale viene indicato come riportato di seguito.

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

Notare in questo calcolo che il membro "SalesYTD" viene calcolato in modalità cella (Cell), pertanto gennaio viene calcolato per primo perché precede gli altri mesi nel profilo, indipendentemente dall'ordine delle istruzioni condizionali if.

È possibile ottimizzare questi script riordinando le istruzioni e aggiungendo un operatore NOT alla prima condizione, come indicato nell'esempio riportato di seguito.

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

Il calcolo in questo caso richiede meno di un quarto del tempo rispetto all'esempio precedente perché oltre il 90% dei dati soddisfa il criterio nell'istruzione if.

Note:

In questo esempio, per ottenere i risultati corretti è fondamentale calcolare la formula nell'ordine del profilo (febbraio deve essere calcolato dopo gennaio, marzo dopo febbraio e così via). È possibile utilizzare @calcmode(Cell) per forzare l'ordine se non viene applicato automaticamente.