Présentation des concepts d'ordre de passage et d'ordre de résolution (MDX)

Lorsqu'un cube est calculé suite à un script MDX, il peut subir de nombreuses étapes de calcul, en fonction de l'utilisation de différentes fonctionnalités liées au calcul. Chacune de ces étapes porte le nom de test de calcul.

Un test de calcul peut être désigné par sa position ordinale, appelée numéro de test de calcul. Le nombre de tests nécessaires au calcul complet de toutes les cellules d'un cube est la profondeur du test de calcul du cube.

Les données de table de faits et d'écriture différée affectent uniquement le test 0. Les scripts remplissent les données après le test 0 ; chaque instruction d'assignation et de calcul d'un script crée un nouveau test. En dehors du script MDX, les références au test absolu 0 font référence au dernier test créé par le script pour le cube.

Des membres calculés sont calculés à tous les tests, mais l'expression est appliquée au test actuel. Les tests antérieurs contiennent la mesure calculée, mais avec une valeur nulle.

Ordre de résolution

L'ordre de résolution détermine la priorité de calcul en cas de concurrence entre des expressions. Au sein d'un même test de calcul, l'ordre de résolution détermine deux choses :

  • l'ordre dans lequel Microsoft SQL Server Analysis Services évalue les dimensions, les membres, les membres calculés, les cumuls personnalisés et les cellules calculées ;

  • l'ordre dans lequel Analysis Services évalue les membres personnalisés, les membres calculés, les cumuls personnalisés et les cellules calculées.

Le membre qui a l'ordre de résolution le plus élevé est prioritaire.

Notes

L'exception à cette règle concerne la fonction d'agrégation. Les membres calculés avec la fonction d'agrégation ont un ordre de résolution inférieur à toute mesure calculée à intersection.

Valeurs et priorité de l'ordre de résolution

Les valeurs d'ordre de résolution vont de -8181 à 65535. Dans cette plage, certaines valeurs d'ordre de résolution correspondent à des types de calculs spécifiques, comme illustré dans le tableau suivant.

Calcul

Ordre de résolution

Formules de membres personnalisées

-5119

Opérateurs unaires

-5119

Calcul des valeurs visibles

-4096

Tous les autres calculs (sauf indication contraire)

0

Il est vivement recommandé d'utiliser uniquement des entiers positifs lors de la définition des valeurs d'ordre de résolution. Si vous assignez des valeurs inférieures aux valeurs d'ordre de résolution mentionnées dans le tableau précédent, le test de calcul peut devenir imprévisible. Par exemple, le calcul d'un membre calculé reçoit une valeur d'ordre de résolution inférieure à la valeur de formule de cumul personnalisée par défaut (-5119). Une valeur d'ordre de résolution aussi basse fait en sorte que les membres calculés soient calculés avant les formules de cumul personnalisées, ce qui peut produire des résultats incorrects.

Création et modification de l'ordre de résolution

Dans le Concepteur de cube, dans le volet Calculs, vous pouvez modifier l'ordre de résolution des membres calculés et des cellules calculées en modifiant l'ordre des calculs.

Dans MDX, vous pouvez utiliser le mot clé SOLVE_ORDER pour créer ou modifier des membres calculés et des cellules calculées.

Exemples d'ordres de résolution

Afin d'illustrer la complexité potentielle de l'ordre de résolution, la série suivante de requêtes MDX commence par deux requêtes qui ne présentent individuellement aucun problème d'ordre de résolution. Ces deux requêtes sont ensuite combinées dans une requête qui nécessite un ordre de résolution.

Requête 1—Différences entre les revenus et les dépenses

Pour la première requête MDX, afin d'observer les différences entre les revenus et les dépenses pour chaque semestre de l'année, construisez une requête MDX simple semblable à l'exemple suivant :

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

Dans cette requête, il n'existe qu'un seul membre calculé, Year Difference. L'ordre de résolution ne pose par conséquent aucun problème, tant que le cube n'utilise pas de membre calculé.

Cette requête MDX produit un jeu de résultats semblable au tableau suivant.

Income

Expenses

1st half

5000

4200

2nd half

8000

7000

Year Difference

3000

2800

Requête 2—Pourcentage de revenus nets après dépenses

Pour la deuxième requête, afin d'observer le pourcentage de revenus nets après dépenses pour chaque semestre de l'année, utilisez la requête suivante :

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

Cette requête MDX, comme la précédente, ne contient qu'un seul membre calculé, Net Income ; elle ne présente donc aucune complication d'ordre de résolution.

Cette requête MDX produit un jeu de résultats légèrement différent, semblable au tableau suivant.

Income

Expenses

Net Income

1st half

5000

4200

0.16

2nd half

8000

7000

0.125

La différence entre les jeux de résultats des deux requêtes provient de la différence d'emplacement du membre calculé. Dans la première requête, le membre calculé fait partie de l'axe ROWS, et non de l'axe COLUMNS illustré dans la deuxième requête. Cette différence d'emplacement devient importante dans la requête suivante, qui combine les deux membres calculés dans une même requête MDX.

Requête 3—Calculs combinés de différence sur l'année et de revenus nets

Dans cette dernière requête combinant les deux exemples précédents en une seule requête MDX, l'ordre de résolution devient important. Pour vous assurer que les calculs sont effectués dans l'ordre correct, utilisez le mot clé SOLVE_ORDER pour définir l'ordre de calcul.

Le mot clé SOLVE_ORDER spécifie l'ordre de résolution des membres calculés dans une requête MDX ou une commande CREATE MEMBER. Les valeurs entières utilisées avec le mot clé SOLVE_ORDER sont relatives, n'ont pas besoin de commencer à zéro et n'ont pas besoin d'être consécutives. La valeur indique simplement à MDX qu'il doit calculer un membre en fonction des valeurs dérivées du calcul des membres ayant une valeur supérieure. Si un membre calculé est défini sans le mot clé SOLVE_ORDER, la valeur par défaut de ce membre calculé est zéro.

Par exemple, si vous combinez les calculs utilisés dans les deux premiers exemples de requêtes, les deux membres calculés, Year Difference et Net Income, se croisent à une cellule unique dans le jeu de résultats de l'exemple de requête MDX. Seul l'ordre de résolution permet de déterminer la façon dont Analysis Services évaluera cette cellule. Les formules utilisées pour construire cette cellule produiront différents résultats, en fonction de l'ordre de résolution des deux membres calculés.

Tout d'abord, essayez de combiner les calculs utilisés dans les deux premières requêtes dans la requête MDX suivante :

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

Dans cet exemple de requête MDX combinée, Net Income a l'ordre de résolution le plus élevé ; il est donc prioritaire lorsque les deux expressions interagissent. Analysis Services évalue la cellule en question à l'aide de la formule Net Income. Le tableau suivant présente les résultats de ces calculs imbriqués.

Income

Expenses

Net Income

1st half

5000

4200

0.16

2nd half

8000

7000

0.125

Year Difference

3000

2800

0.066

Le résultat mentionné dans la cellule partagée est basé sur la formule de Net Income. Autrement dit, Analysis Services calcule le résultat de la cellule partagée avec les données Year Difference, ce qui donne la formule suivante (le résultat est arrondi pour plus de clarté) :

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

ou

(3000 - 2800) / 3000 = 0.066

Toutefois, Analysis Services calcule le résultat de la cellule partagée différemment si vous permutez les ordres de résolution des membres calculés dans la requête MDX. La requête MDX combinée suivante inverse l'ordre de résolution des membres calculés :

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

L'ordre de résolution des membres calculés ayant été modifié, Analysis Services utilise la formule Year Difference pour évaluer la cellule, comme illustré dans le tableau suivant.

Income

Expenses

Net Income

1st half

5000

4200

0.16

2nd half

8000

7000

0.125

Year Difference

3000

2800

-0.035

Cette requête utilisant la formule Year Difference avec les données Net Income, la formule de la cellule partagée ressemble au calcul suivant :

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

ou

0.125 - 0.16 = -0.035

Considérations supplémentaires

L'ordre de résolution peut s'avérer très délicat à gérer, notamment dans les cubes qui contiennent de très nombreuses dimensions impliquant des formules de membres calculés, des formules de cumul personnalisées ou des cellules calculées. Lorsque Analysis Services évalue une requête MDX, Analysis Services prend en compte les valeurs d'ordre de résolution de tous les éléments impliqués dans un test de calcul donné, y compris les dimensions du cube spécifié dans la requête MDX.