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.