Compartir a través de


Comprensión del orden de paso y el orden de solución (MDX)

Cuando se calcula un cubo como resultado de un script MDX, puede pasar por muchas fases de cálculo en función del uso de varias características relacionadas con el cálculo. Cada una de estas fases se conoce como paso de cálculo.

Un paso de cálculo puede ser referido por una posición ordinal, llamada número de paso de cálculo. El recuento de pasos de cálculo necesarios para calcular completamente todas las celdas de un cubo se conoce como profundidad de paso de cálculo del cubo.

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

Los miembros calculados se crean en cada paso, pero la expresión se aplica en el paso actual. Las pasadas anteriores contienen la medida calculada, pero con un valor nulo.

Orden de resolución

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

  • El orden en el que Microsoft SQL Server Analysis Services evalúa dimensiones, miembros, miembros calculados, rollups personalizados y celdas calculadas.

  • Orden en el que Analysis Services calcula miembros personalizados, miembros calculados, acumulación personalizada y celdas calculadas.

El miembro con el orden de resolución más alto tiene prioridad.

Nota:

La excepción a esta precedencia es la función Aggregate. Los miembros calculados con la función Aggregate tienen un orden de resolución menor que cualquier medida calculada que lo interseque.

Determinar los valores de orden y la precedencia

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

Cálculo Orden de resolución
Fórmulas de miembro personalizadas -5119
Operadores unarios -5119
Cálculo visual de totales -4096
Todos los demás cálculos (si no se especifican de otro modo) 0

Se recomienda encarecidamente usar solo enteros positivos al establecer valores de orden de resolución. Si asigna valores inferiores a los valores de orden de resolución que se muestran en la tabla anterior, el paso de cálculo puede ser impredecible. Por ejemplo, el cálculo de un miembro calculado recibe un valor de orden de resolución inferior al valor predeterminado de la fórmula de acumulación personalizada de -5119. Este valor de orden de resolución bajo hace que los miembros calculados se calculen antes de las fórmulas de acumulación personalizadas y pueden generar resultados incorrectos.

Creación y cambio del orden de resolución

En Cube Designer, en el Panel de Cálculos, puede cambiar el orden de resolución de los miembros calculados y las celdas calculadas cambiando el orden de los cálculos.

En MDX, puede usar la SOLVE_ORDER palabra clave 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 cada una de ellas individualmente no tiene problemas de orden de resolución. Estas dos consultas se combinan en una consulta que requiere el orden de resolución.

Nota:

Puede ejecutar estas consultas MDX en la base de datos multidimensional de ejemplo de Adventure Works. Puede descargar el ejemplo AdventureWorks Multidimensional Models SQL Server 2012 desde el sitio de codeplex.

Consulta 1-Diferencias en ingresos y gastos

Para la primera consulta MDX, calcule la diferencia en las ventas y los costos de cada año mediante la construcción de una consulta MDX simple similar al ejemplo siguiente:

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] )  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

En esta consulta, solo hay un miembro calculado, Year Difference. Dado que solo hay un miembro calculado, el orden de resolución no es un problema, siempre y cuando el cubo no use ningún miembro calculado.

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

Importe de ventas por Internet Costo total del producto de Internet
CY 2007 $9,791,060,30 $5,718,327.17
CY 2008 $9,770,899.74 $5,721,205.24
Diferencia de año ($20,160,56) $2.878.06

Consulta 2-Porcentaje de ingresos después de gastos

Para la segunda consulta, calcule el porcentaje de ingresos después de los gastos de cada año mediante la siguiente consulta MDX:

WITH   
MEMBER  
[Measures].[Profit Margin] AS   
([Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent"  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008] }  
ON ROWS  
FROM [Adventure Works]  

Esta consulta MDX, como la anterior, tiene solo un único miembro calculado Profit Margin, y por lo tanto no tiene complicaciones de orden de resolución.

Esta consulta MDX genera un conjunto de resultados ligeramente diferente, similar a la tabla siguiente.

Importe de ventas por Internet Costo total del producto de Internet Margen de beneficios
CY 2007 $9,791,060,30 $5,718,327.17 41.60%
CY 2008 $9,770,899.74 $5,721,205.24 41.45%

La diferencia en los conjuntos de resultados entre la primera consulta y la segunda consulta procede de la diferencia en la colocación del miembro calculado. En la primera consulta, el miembro calculado forma parte del eje ROWS, no del eje COLUMNS que se muestra en la segunda consulta. Esta diferencia en la ubicación es importante en la siguiente consulta, que combina los dos miembros calculados en una única consulta MDX.

Consulta 3-Combinación de diferencias de año y cálculos de ingresos netos

En esta consulta final que combina los dos ejemplos anteriores en una sola consulta MDX, el orden de resolución es importante debido a los cálculos de las columnas y las filas. Para asegurarse de que los cálculos se producen en la secuencia correcta, defina la secuencia en la que se producen los cálculos mediante la SOLVE_ORDER palabra clave .

La SOLVE_ORDER palabra clave especifica el orden de resolución de los miembros calculados en una consulta MDX o un comando CREATE MEMBER. Los valores enteros usados con la SOLVE_ORDER palabra clave son relativos, no es necesario iniciar en cero y no es necesario que sean consecutivos. El valor simplemente indica a MDX que calcule un miembro en función de los valores derivados del cálculo de miembros con un valor mayor. Si se define un miembro calculado sin la SOLVE_ORDER palabra clave , el valor predeterminado de ese miembro calculado es cero.

Por ejemplo, si combina los cálculos usados en las dos primeras consultas de ejemplo, los dos miembros calculados Year Difference y Profit Margin se cruzan en una única celda del conjunto de datos resultante 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 que se usan para construir esta celda producirán resultados diferentes en función del orden de resolución de los dos miembros calculados.

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

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] ) ,  
SOLVE_ORDER = 1  
MEMBER  
[Measures].[Profit Margin] AS   
( [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent" ,  
SOLVE_ORDER = 2  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

En este ejemplo de consulta MDX combinado, Profit Margin tiene el orden de resolución más alto, por lo que tiene prioridad cuando interactúan las dos expresiones. Analysis Services evalúa la celda en cuestión mediante la Profit Margin fórmula . Los resultados de este cálculo anidado, como se muestra en la tabla siguiente.

Importe de ventas por Internet Costo total del producto de Internet Margen de beneficios
CY 2007 $9,791,060,30 $5,718,327.17 41.60%
CY 2008 $9,770,899.74 $5,721,205.24 41.45%
Diferencia de año ($20,160,56) $2.878.06 114.28%

El resultado en la celda compartida se basa en la fórmula para Profit Margin. Es decir, Analysis Services calcula el resultado en la celda compartida con los Year Difference datos, lo que genera la fórmula siguiente (el resultado se redondea para mayor claridad):

((9,770,899.74 - 9,791,060.30) - (5,721,205.24 - 5,718,327.17)) / (9,770,899.74 - 9,791,060.30) = 1.14275744   

o

(23,038.63) / (20,160.56) = 114.28%  

Esto es claramente incorrecto. Sin embargo, Analysis Services calcula el resultado en la celda compartida de manera diferente si cambia las órdenes de resolución para los miembros calculados en la consulta MDX. La siguiente consulta MDX combinada revisa el orden de solución para los miembros calculados.

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] ) ,  
SOLVE_ORDER = 2  
MEMBER  
[Measures].[Profit Margin] AS   
( [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent" ,  
SOLVE_ORDER = 1  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

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

Importe de ventas por Internet Costo total del producto de Internet Margen de beneficios
CY 2007 $9,791,060,30 $5,718,327.17 41.60%
CY 2008 $9,770,899.74 $5,721,205.24 41.45%
Diferencia de año ($20,160,56) $2.878.06 (0,15%)

Dado que esta consulta usa la Year Difference fórmula con los Profit Margin datos, la fórmula de la celda compartida es similar al siguiente cálculo:

(($9,770,899.74 - 5,721,205.24) / $9,770,899.74) - ((9,791,060.30 - 5,718,327.17) / 9,791,060.30) = -0.15   

O bien,

0.4145 - 0.4160= -0.15  

Consideraciones adicionales

El orden de resolución puede ser un problema muy complejo para tratar, especialmente en cubos con un gran número de dimensiones que implican miembros calculados, fórmulas de acumulación personalizadas o celdas calculadas. Cuando Analysis Services evalúa una consulta MDX, Analysis Services tiene en cuenta los valores de orden de resolución de todo lo implicado en un paso determinado, incluidas las dimensiones del cubo especificado en la consulta MDX.

Véase también

CalculationCurrentPass (MDX)
CalculationPassValue (MDX)
Instrucción CREATE MEMBER (MDX)
Manipular datos (MDX)