Partager via


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

Lorsqu'un cube est calculé dans le cadre d'un script MDX, il peut subir de nombreuses étapes de calcul, en fonction de l'utilisation de diverses 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 représente 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 test. En dehors du script MDX, les références au test absolu 0 correspondent au dernier test créé par le script pour le cube.

Des membres calculés sont créé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 Null.

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 MicrosoftSQL ServerAnalysis 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.

[!REMARQUE]

L'exception à cette règle de priorité 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.

Priorité de calcul

La priorité de calcul définit l'ordre dans lequel les valeurs sont obtenues pour une expression définie dans la cellule active. Elle est résolue en fonction de l'algorithme suivant :

  1. Une liste de calculs est créée à partir de tous les calculs au niveau de granularité de la cellule active ou en dessous

  2. Les calculs qui figurent dans cette liste sont classés en deux catégories : Le plus élevé l'emporte ou Le plus proche l'emporte

    1. La catégorie Le plus proche l'emporte comprend les cumuls personnalisés, les opérateurs unaires, les mesures semi-additives et les gels

    2. La catégorie Le plus élevé l'emporte comprend tous les autres types de calculs

  3. Une liste de calculs ordonnée est créée à partir de tous les calculs de la catégorie Le plus élevé l'emporte selon un ordre de passage

  4. Pour chacun des calculs restants de la catégorie Le plus proche l'emporte

    1. Pour chaque calcul de la liste de calculs ordonnée (du plus grand au plus petit)

    2. Si un calcul de la catégorie Le plus proche l'emporte est plus proche de la cellule active qu'un calcul de la liste de calculs ordonnée, insérer le calcul de la catégorie Le plus proche l'emporte dans la liste de calculs ordonnée, puis passer au calcul suivant de la catégorie Le plus proche l'emporte

    3. Si un calcul de la catégorie Le plus proche l'emporte a un ordre de passage plus élevé qu'un calcul de la liste de calculs ordonnée, insérer le calcul de la catégorie Le plus proche l'emporte dans la liste de calculs ordonnée, puis passer au calcul suivant de la catégorie Le plus proche l'emporte

    4. Continuer avec le prochain calcul de la liste de calculs ordonnée

  5. Si le calcul le plus élevé de la liste de calculs ordonnée n'est pas au même niveau de granularité que la cellule active, calculer la valeur d'agrégation à l'aide des fonctions d'agrégation

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

Les valeurs d'ordre de résolution sont comprises entre -8 181 et 65 535. 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

-5 119

Opérateurs unaires

-5 119

Calcul des valeurs totales affichées

-4 096

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 qui est inférieure à la valeur de la formule de cumul personnalisé par défaut, à savoir -5 119. Une valeur d'ordre de résolution aussi faible entraîne le calcul des membres calculés avant le calcul des formules de cumul personnalisé, 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 seconde 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 MDX 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 approprié, utilisez le mot clé SOLVE_ORDER afin de définir l'ordre des calculs.

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, elles n'ont pas besoin de commencer à zéro et n'ont pas besoin d'être consécutives. La valeur indique simplement à la requête MDX de 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 dataset des 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 membres calculés, des formules de cumul personnalisé ou des cellules calculées. Au moment où 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.