Optimización de scripts de cálculo de Essbase mediante el uso de NOT en sentencias IF

En scripts de cálculo de Oracle Essbase, se utiliza la sentencia if para ejecutar el código si una condición es True, y las sentencias else y else if para especificar cada nueva condición a fin de probar si la condición evaluada previamente es False.

Puede optimizar el código que utiliza sentencias if y else if analizando la condición que cumple con la mayoría de sus datos y, a continuación, desplazando la evaluación de esa condición al comienzo del código para que se ejecute lo antes posible.

Observe el siguiente ejemplo de script de cálculo para Sample.Basic, donde Cuentas y Tiempo son una dimensión densa:

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

En este caso, más del 90 % de los datos cumplen el criterio de la condición else. Solamente el 10 % de los datos cumplen el criterio de la condición if. Debido a la función @prior en la condición else, January se debe calcular antes que el resto de meses. Al ejecutar este cálculo, el tiempo total transcurrido se informa como:

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

En este cálculo, tenga en cuenta que el miembro "SalesYTD" se calcula en modo de celda, lo que significa que como January aparece antes que otros meses en el esquema, se calcula en primer lugar independientemente del orden de las sentencias condicionales if.

Puede optimizar dichos scripts volviendo a ordenar las sentencias y agregando un operador NOT a la primera condición como se muestra en este ejemplo:

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

El cálculo, en este caso, lleva menos de una cuarta parte del tiempo en comparación con el ejemplo anterior porque más del 90 % de los datos cumplen el criterio de la sentencia if.

Note:

En este ejemplo, es obligatorio que la fórmula se calcule en el orden del esquema (February debe calcularse después de January, March después de February, etc.) para obtener los resultados correctos. Puede usar @calcmode(Cell) para forzar el orden si no se produce automáticamente.