Compartir a través de


Descripción de orden de paso y orden de resolución (MDX)

Cuando un cubo se calcula como el resultado de un script de MDX, puede atravesar varias fases de computación según el uso de varias características relativas al cálculo. Cada una de estas fases se denomina paso de cálculo.

Se puede hacer referencia a un paso de cálculo con una posición ordinal, llamada número de paso de cálculo. El recuento de los pasos de cálculo necesarios para calcular por completo todas las celdas de un cubo se denomina profundidad de paso de cálculo del cubo.

Los datos de la tabla de hechos y reescritura sólo afectan al paso 0. Los scripts rellenan los datos después del paso 0; cada instrucción de asignación y cálculo de un script crea un nuevo paso. Fuera del script MDX, las referencias al paso absoluto 0 hacen referencia al último paso creado por el script del cubo.

Los miembros calculados se crean en todos los pasos, pero la expresión se aplica al paso actual. Los pasos anteriores contienen la medida calculada, pero con un valor NULL.

Orden de resolución

El orden de resolución determina la prioridad de cálculo en el caso de expresiones enfrentadas. En un solo paso, el orden de resolución determina dos cosas:

  • El orden en el que MicrosoftSQL ServerAnalysis Services evalúa dimensiones, miembros, miembros calculados, resúmenes personalizados y celdas calculadas.

  • El orden en el que Analysis Services calcula miembros personalizados, miembros calculados, resúmenes personalizados y celdas calculadas.

Tendrá prioridad el miembro con el orden de resolución superior.

[!NOTA]

La excepción a esta prioridad es la función Agregado. Los miembros calculados con la función Agregado tienen un orden de resolución inferior al de las medidas calculadas coincidentes.

Prioridad de cálculo

La prioridad del cálculo define el orden en el que los valores se obtienen para una expresión definida en la celda actual. La prioridad del cálculo se resuelve según el algoritmo siguiente:

  1. Se crea una lista de cálculo (CL) a partir de todos los cálculos con la granularidad de la celda actual o inferior

  2. Los cálculos de CL se clasifican en victorias superiores (HW) o victorias más próximas (CW)

    1. CW son resúmenes personalizados, operadores unarios, medidas semiaditivas, inmovilizados

    2. HW son todos los demás cálculos

  3. Se crea una lista ordenada de cálculos (OCL) con todos los HW ordenados por paso

  4. Para cada uno de los CW restantes

    1. Para cada cálculo (C) de OCL (del superior al inferior)

    2. Si CW está más cercano a la celda actual que C, insertar CW en OCL y continuar con el próximo CW

    3. Si CW está un paso por encima que C, insertar CW en OCL y continuar en el siguiente CW

    4. Continuar con el siguiente C

  5. Si el cálculo mayor de OCL no está en la misma granularidad de la celda actual, calcular el valor agregado usando las funciones de agregado

Valores y prioridad de orden de resolución

Los valores de orden de resolución varían de -8181 a 65535. En este intervalo, algunos valores de orden de resolución corresponden a tipos específicos de cálculos, como se muestra en la siguiente tabla.

Cálculo

Orden de resolución

Fórmulas de miembro personalizado

-5119

Operadores unarios

-5119

Cálculo de totales visuales

-4096

Resto de cálculos (si no se especifica lo contrario)

0

Se recomienda utilizar enteros positivos para establecer valores de orden de resolución. Si asigna valores posteriores a los valores de orden de resolución mostrados en la tabla anterior, el paso de cálculo puede resultar imprevisible. Por ejemplo, el cálculo de un miembro calculado recibe un valor de orden de resolución que es menor que el valor de la fórmula de resumen personalizado predeterminado de -5119. Dicho valor de orden de resolución bajo produce los miembros calculados que se van a calcular antes de las fórmulas de resumen personalizadas y puede generar resultados incorrectos.

Crear y cambiar el orden de resolución

En el Diseñador de cubos, en el panel Cálculos, puede cambiar el orden de resolución de miembros calculados y celdas calculadas si cambia el orden de los cálculos.

En MDX, puede utilizar la palabra clave SOLVE_ORDER para crear o cambiar miembros calculados y celdas calculadas.

Ejemplos de orden de resolución

Para ilustrar las posibles complejidades del orden de resolución, la siguiente serie de consultas MDX comienza con dos consultas que no presentan individualmente problemas de orden de resolución. Estas dos consultas se combinan en una consulta que requiere un orden de resolución.

Consulta 1—Diferencias de Income y Expenses

En la primera consulta MDX, para ver la diferencia de ingresos y gastos para cada semestre del año, debe crear una consulta MDX simple similar al siguiente ejemplo:

WITH
MEMBER [Time].[Year Difference] AS
   [Time].[2nd half] - [Time].[1st half]
SELECT 
   { [Account].[Income], [Account].[Expenses] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials

En esta consulta, sólo existe un miembro calculado: Year Difference. Dado que sólo existe un miembro calculado, el orden de resolución no supone un problema mientras el cubo no utilice miembros calculados.

Esta consulta MDX ofrece un conjunto de resultados similar a la siguiente tabla.

 

Income

Expenses

1st half

5000

4200

2nd half

8000

7000

Year Difference

3000

2800

Consulta 2—Porcentaje de Net Income después de Expenses

En la segunda consulta, para ver el porcentaje de ingresos netos después de gastos para cada semestre del año, utilice la siguiente consulta MDX:

WITH
MEMBER [Account].[Net Income] AS
   ([Account].[Income],  [Account].[Expenses]) / [Account].[Income]
SELECT
   { [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half] } ON ROWS
FROM Financials

En esta consulta MDX, al igual que en la anterior, sólo existe un miembro calculado, Net Income, por lo que no se producen complicaciones por el orden de resolución.

Esta consulta MDX ofrece un conjunto de resultados similar a la siguiente tabla.

 

Income

Expenses

Net Income

1st half

5000

4200

0.16

2nd half

8000

7000

0.125

La diferencia de los conjuntos de resultados entre la primera y la segunda consulta radica en la distinta colocación del miembro calculado. En la primera consulta, el miembro calculado se encuentra en el eje ROWS, mientras que en la segunda consulta se encuentra en el eje COLUMNS. Esta distinta colocación adquiere importancia en la siguiente consulta, en la que se combinan dos miembros calculados en una única consulta MDX.

Consulta 3—Cálculos combinados de Year Difference y Net Income

En esta última consulta en la que se combinan los dos ejemplos anteriores en una única consulta MDX, el orden de resolución resulta importante. Para garantizar que los cálculos se realizan en la secuencia correcta, defina la secuencia en la que se realizan los cálculos con la palabra clave SOLVE_ORDER.

La palabra clave SOLVE_ORDER especifica el orden de resolución de los miembros calculados en una consulta MDX o en un comando CREATE MEMBER. Los valores de entero utilizados con la palabra clave SOLVE_ORDER son relativos, no necesitan comenzar en cero y no tienen que ser consecutivos. El valor ordena a MDX calcular un miembro según los valores resultantes del cálculo de miembros con un valor superior. Si se define un miembro calculado sin la palabra clave SOLVE_ORDER, su valor predeterminado es cero.

Por ejemplo, si combina los cálculos utilizados en las dos primeras consultas de ejemplo, la intersección de los dos miembros calculados, Year Difference y Net Income, se produce en una única celda en el conjunto de datos de resultados del ejemplo de consulta MDX. La única manera de determinar cómo Analysis Services evaluará esta celda es mediante el orden de resolución. Las fórmulas utilizadas para crear esta celda ofrecerán resultados diferentes según del orden de resolución de los dos miembros calculados.

En primer lugar, intente combinar los cálculos utilizados en las dos primeras consultas en la siguiente consulta MDX:

WITH
MEMBER [Time].[Year Difference] AS
   '[Time].[2nd half] - [Time].[1st half],
   SOLVE_ORDER = 1
MEMBER [Account].[Net Income] AS
   '([Account].[Income] - [Account].[Expenses]) / [Account].[Income]',
   SOLVE_ORDER = 2
SELECT
   { [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials

En este ejemplo combinado de consulta MDX, Net Income posee el orden de resolución superior, por lo que tendrá prioridad si interactúan las dos expresiones. Analysis Services evalúa dicha celda mediante la fórmula Net Income. Los resultados de este cálculo anidado pueden verse en la siguiente tabla.

 

Income

Expenses

Net Income

1st half

5000

4200

0.16

2nd half

8000

7000

0.125

Year Difference

3000

2800

0.066

El resultado de la celda compartida se basa en la fórmula para Net Income. Es decir, Analysis Services calcula el resultado en la celda compartida con los datos de Year Difference y ofrece la siguiente fórmula (se ha redondeado el resultado para obtener mayor claridad):

((8000 - 5000) - (7000 - 4200)) / (8000 - 5000) = 0.066 

o bien

(3000 - 2800) / 3000 = 0.066

Sin embargo, Analysis Services calcula el resultado en una celda compartida de distinto modo si cambia el orden de resolución de los miembros calculados en la consulta MDX. La siguiente consulta MDX combinada invierte el orden de resolución de los miembros calculados:

WITH
MEMBER [Time].[Year Difference] AS
   '[Time].[2nd half] - [Time].[1st half],
   SOLVE_ORDER = 2
MEMBER [Money].[Net Income] AS
   '([Money].[Income] - [Money].[Expenses]) / [Money].[Income]',
   SOLVE_ORDER = 1
SELECT
   { [Money].[Income], [Money].[Expenses], [Money].[Net Income] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM TestCube

Como se ha cambiado el orden de los miembros calculados, Analysis Services utiliza la fórmula Year Difference para evaluar la celda, como se muestra en la siguiente tabla.

 

Income

Expenses

Net Income

1st half

5000

4200

0.16

2nd half

8000

7000

0.125

Year Difference

3000

2800

-0.035

Puesto que la consulta utiliza la fórmula Year Difference con los datos de Net Income, la fórmula de la celda compartida es similar al siguiente cálculo:

((8000 - 7000) / 8000) - ((5000 - 4200) / 5000) = -0.035 

o bien

0.125 - 0.16 = -0.035

Consideraciones adicionales

El orden de resolución puede ser un aspecto muy complicado, especialmente en cubos con un gran número de dimensiones que tienen miembros calculados, fórmulas de resúmenes personalizados o celdas calculadas. Cuando Analysis Services evalúa una consulta MDX, Analysis Services tiene en cuenta los valores del orden de resolución de todos los elementos implicados en un paso determinado, incluidas las dimensiones del cubo especificado en la consulta MDX.