[SSAS] 2008 et les précédences de calcul

Il semble vraiment que la tendance amorcée depuis 2005 avec une simplification des règles d’évaluation des calculs MDX se perpétue en 2008.
Tout cela remettant en cause pas mal de modes de développement choisis – à bon ou mauvais escient – sur les versions précédentes. La migration 2005/2008 peut donc poser des problèmes à certains dans des cas assez particuliers, sur lesquels je voulais attirer votre attention et dont je possède un exemple assez frais.

Si vous parcourez BOL (http://msdn.microsoft.com/fr-fr/library/ms143742.aspx) vous tomberez sur ceci:

Si un cube contient une dimension avec des formules de niveau personnalisées ainsi que des dimensions avant et après avec des formules de membre personnalisées et/ou des opérateurs unaires, il se peut qu’il retourne des résultats différents de ceux des versions précédentes de Analysis Services. Cette situation se produit car le calcul des règles de précédence a changé.

Intéressant. En se plongeant dans les articles de BOL sur le SOLVE_ORDER et dans l’excellent AS Unleashed, on constate en effet un gros effort de documentation de ces règles de précédence et de calcul, qui contraste avec le peu de différences entre les versions de documentation sur les autres aspects du moteur.

Pour résumer il semble que les bidouillages à base de CALCULATION_PASS et de SOLVE_ORDER voient leurs instants comptés dans le script MDX du cube, au bénéfice de l’ordonnancement de celui-ci. Cela se confirme par la dépréciation des CELL CALCULATION au profit des assignments qui eux ne disposent pas de propriétés d’ordre modifiables.
Certes il n’est pas vrai que l’ordre du script soit toujours l’ordre d’évaluation – le MDX n’est pas du C#, cf l’utilité de FREEZE – mais il bénéficie au moins d’une prédictivité plus évidente.

Dans le cas de combinaisons avec des HighestPass (Unary, Custom Rollup) l’ordre de résolution des calculs est maintenant plus clair: entre une CR et un ensemble de calculs donné du script on comprend désormais quelles sont les règles de précédence, même si elles sont parfois troublantes. Il reste possible de jouer avec le SOLVE_ORDER dans la CustomRollupPropertyColumn mais là encore l’ordre n’est pas garanti (en effet le SOLVE ORDER n’est pas le seul critère d’évaluation, cf http://msdn.microsoft.com/en-us/library/ms145539.aspx).

Ces changements peuvent parfois poser des problèmes: le fonctionnement peu clair de 2005 obligeait à des développement empiriques – comme celui sur lequel je travaille en ce moment.
L’ordre de calcul entre deux expressions MDX et une C.R.Formula était pour le moins étrange: en 2005 la rollup s’évaluait au beau milieu des calculs de script sans que l’on en comprenne la raison.
Une fois migrée en 2008, la rollup s’évalue dans mon cas avant conformément aux règles énoncées et cela peut poser des problèmes si on considérait la précédence 2005 comme acquise.

La réponse de Microsoft à ce sujet est de tenter de ne jamais mélanger assignments, membres calculés et CustomRollup sur un même calcul car même mieux documentées ces règles peuvent avoir un comportement défiant la logique initiale.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s