mercredi 11 juillet 2012

[SSAS 2012] Croiser les niveaux fins des dimensions avec Analysis Services en mode Tabular

Après deux articles sur les termes en vogue du moment, un petit retour chez Microsoft s'impose, et notamment sur SQL Server 2012 sorti cette année.
La nouvelle version d'Analysis Services a apporté un nouveau mode qui provient directement de PowerPivot : le mode Tabular.

On ne reviendra pas sur les différences entre les versions Tabular et Multidimensionnal (toutes deux disponibles dans SQL Server 2012), ni sur le mode à adopter suivant les projets, de nombreux articles de blogs en parlent. De plus cela a fait l'objet d'une session aux TechDays de cette année (lien).

On va s'intéresser ici aux performances lors de l'interrogation d'un cube au format Tabular. En effet, ce mode  a aussi été introduit pour répondre à la problématique d'interrogation des données fines via un cube.
Avant la sortie de SQL Server 2012, la réponse typique du consultant lorsque le client demandait un rapport croisant plusieurs niveaux fins de plusieurs dimensions était : "un cube Analysis Services n'est pas fait pour ça" (note de l'auteur : ce qui en soit n'est pas faux).

On va donc effectuer un petit test rapide :

On crée deux cubes "identiques" en multidimensionnel et en tabulaire : un cube avec une mesure CA, 3 dimensions (client, produit et magasin) et 1 million de lignes.



Sur ces cubes on va appliquer la requête MDX suivante (au nommage des objets entre les deux cubes près) :

Les résultats obtenus sont les suivants :

Multidimensionnel : 28s pour l'exécution de la requête :


Tabulaire : 29s pour l'exécution de la requête :



Mais alors finalement, il n'y a pas de différence selon le moteur utilisé ?

En fait la différence se fait par rapport au langage utilisé : MDX versus DAX. Et le DAX ne peut être utilisé (aujourd'hui) qu'avec les modèles tabulaires.
Si vous attaquez votre cube en MDX, vous ne constaterez que peu de différence de performance entre les deux modes. En revanche si vous traduisez votre requête MDX en DAX sur votre modèle tabulaire, vous allez constater une nette amélioration.

Sur mon modèle tabulaire, j'exécute la requête suivante (qui renvoie le même résultat que ma requête MDX) :

On obtient une durée d'exécution de 9s (Notez que c'est à 1s près le temps d'exécution de la requête SQL pour sortir le même résultat sur les tables sources) :


On constate bien le gain appréciable de performance obtenu.

En conclusion si vous avez opté pour le mode multidimensionnel, pas de changement d'attitude à avoir, c'est encore le langage MDX que vous devrez utiliser (du moins pour l'instant).

En revanche si vous avez opté pour le mode tabulaire, il peut être vraiment intéressant de se pencher sur le langage DAX dès l'instant où vous interrogez des données fines dans les dimensions.











3 commentaires:

  1. David, tu pourrais nous faire le même test avec un DISTINCT COUNT steuplait? :)

    Ps : C'est une vraie misère pour poster des commentaires sur blogspot. Faut le vouloir!

    RépondreSupprimer
  2. Oui, je pourrais. Par contre c'est une problématique différente de celle exposée ici. les performances des DISTINCT COUNT sont intéressantes à regarder à des niveaux agrégés.

    RépondreSupprimer
  3. Corrige moi si je me trompe, mais j'ai comme l'impression que tu bottes en touche? :)

    RépondreSupprimer