Vous ĂŞtes plusieurs Ă m’Ă©crire pour me parler des problèmes de performance que vous Ă©prouvez avec vos modèles de donnĂ©es dans Power Pivot. Cet article vise donc Ă clarifier les limites d’un modèle de donnĂ©es dans Power Pivot et Ă dresser la liste des meilleures pratiques Ă adopter afin d’optimiser leur performance.
Limites d’un modèle de donnĂ©es
Avant d’Ă©laborer des modèles de donnĂ©es, vous devez ĂŞtre conscient des limites de Power Pivot. Ceci vous forcera Ă prendre l’habitude de maintenir vos modèles de donnĂ©es au plus simple de leur forme. De toutes façons, lorsqu’un modèle de donnĂ©es comprend trop de tables et trop de colonnes par table, il devient difficile Ă utiliser par les usagers, qui ont du mal Ă identifier les tables et les colonnes nĂ©cessaires à  leurs analyses. Un tel modèle consomme Ă©galement beaucoup de mĂ©moire, ce qui affecte sa performance.
Les modèles de donnĂ©es dans Power Pivot utilisent un engin “In-memory” nommé xVelocity. Cet engin utilise des techniques de compression avancĂ©es qui permettent de rĂ©duire des ensembles de donnĂ©es Ă une fraction de leur taille originale. Mais pour bĂ©nĂ©ficier des avantages de cet engin de compression, il faut comprendre comment il fonctionne et Ă©laborer des modèles de donnĂ©es en consĂ©quence. En moyenne, on estime que la taille d’un modèle de donnĂ©es est de 7 Ă 10 fois plus petite que la taille des ensembles de donnĂ©es qui ont servi Ă le crĂ©er. Par exemple, si vous importez 7MB de donnĂ©es d’un serveur SQL dans Power Pivot, votre modèle de donnĂ©es pourrait facilement faire moins de 1 MB.
Ce qu’il faut surtout retenir ici, c’est que le degrĂ© de compression est intimement liĂ© au nombre de valeurs uniques dans une colonne. Plus il y a de valeurs uniques, plus le modèle de donnĂ©es consomme de mĂ©moire et l’inverse est aussi vrai. Si vous ĂŞtes conscient de cette rĂ©alitĂ©, vous Ă©laborerez automatiquement de meilleurs modèles de donnĂ©es.
L’article suivant pourrait vous intĂ©resser puisqu’il traite en dĂ©tail des spĂ©cifications et des limites de Power Pivot Power Pivot: Data Model specification and limits.
Quelques concept importants
Avant d’aller plus loin, vous devez maĂ®triser certains concepts:
- Une table de faits inclut gĂ©nĂ©ralement des donnĂ©es transactionnelles ou des donnĂ©es de performance d’entreprise, comme les ventes ou le coĂ»t des ventes, qui sont ensuite associĂ©es ou non Ă des dimensions (divisions, rĂ©gions, canaux, reprĂ©sentants, etc.).
- Une colonne calculĂ©e en DAX est une colonne dĂ©rivĂ©e des colonnes originales du modèle de donnĂ©es. Autrement, elle a les mĂŞmes caractĂ©ristiques qu’une colonne importĂ©e.
- Une mesure DAX est dĂ©finie une seule fois dans le modèle de donnĂ©es et est évaluĂ©e seulement lorsqu’elle est utilisĂ©e dans un tableau croisĂ© dynamique ou dans un autre type de rapport.
- Vous ne devriez jamais charger les donnĂ©es Ă la fois dans Excel et dans votre modèle de donnĂ©es. Ça peut sembler aller de soi, mais j’ai vu certains de mes clients le faire et avoir de gros problèmes de performance. Évidemment, car, dans ce cas, nous sommes confrontĂ©s aux contraintes d’un fichier Excel.
- Quand une page Excel contenant des donnĂ©es provenant de Power Pivot est ouverte, la consommation de mĂ©moire n’est pas affectĂ©e par le volume de donnĂ©es dans Power Pivot. Les donnĂ©es sont chargĂ©es seulement quand la fenĂŞtre Power Pivot est ouverte ou quand un tableau/graphique croisĂ© dynamique est mis Ă jour.
- Les messages suivants doivent être interprétés comme suit:
- Retrieving Data: Traitement des données (importation depuis la source dans le modèle de données)
- Loading Data Model : Chargement du modèle de données en mémoire
- Reading Data: Requête sur le modèle de données et mise à jour des tableaux croisés dynamiques et autres rapports
- Power Pivot utilise 2 sortes de compressions:
- Hash encoding
- utilisé pour les tables de valeurs uniques (tables de dimensions)
- consomme de la RAM (est plus lent)
- Value encoding
- utilisé pour les valeurs numériques et les opérations mathématiques (tables de faits)
- consomme davantage du CPU
- Les colonnes clés des tables de faits et des tables de dimensions devraient toujours êtres de type entier (integer)
- Au besoin, utiliser Power Query pour remplacer du texte par des chiffres entiers
- Pour en savoir davantage sur la compression des données dans Power Pivot:
- Hash encoding
Limites de votre quincaillerie
Si vous ĂŞtes sĂ©rieux par rapport Ă l’usage que vous souhaitez faire de Power Pivot, il faut vous Ă©quiper des bons outils. Vous ne pourrez pas optimiser la performance de vos modèles de donnĂ©es si vous n’avez pas les prĂ©-requis suivants:
- 64 bit Windows, 64 bit Office
- Processeur 4 coeurs
- Mémoire vive suffisante, au minimum 8 GB de RAM, mais 16 GB est largement préférable
- Un SSD (Solide State Drive) est préférable
Optimisation d’un modèle de donnĂ©es
1. Réduire le nombre de colonnes
Le meilleur moyen d’augmenter la performance d’un modèle de donnĂ©es est de rĂ©duire au maximum le nombre de colonnes, plus particulièrement, les colonnes qui comprennent un large Ă©ventail de valeurs uniques. Ce faisant, vous devez toujours vous demander si vous avez vraiment besoin d’une colonne avant de l’importer et n’importer seulement les colonnes qui seront nĂ©cessaires Ă la bonne conduite de vos analyses. Mieux vaut en importer moins au dĂ©part et en ajouter par la suite, au besoin.
Les colonnes comprenant des chaînes de texte devraient être analysées et transformées au besoin, sachant que:
- Power Pivot crée un dictionnaire de toutes les chaînes de texte uniques.
- Donc, avoir une longue chaĂ®ne de texte n’est pas un problème en soi si le modèle contient peu de chaĂ®nes de texte distinctes.
- Cela peut par contre devenir un problème si, en moyenne, la longueur des chaĂ®nes de texte est importante et qu’il y a beaucoup de valeurs distinctes.
Exemples de colonnes qui mĂ©ritent d’ĂŞtre supprimĂ©es ou regroupĂ©es autrement:
- Toutes les colonnes d’un entrepĂ´t de donnĂ©es qui sont le rĂ©sultat d’un processus ETL comme : Create_Date, Update_Date, ETL_Run, etc.
- Toutes les clĂ©s primaires d’une table de faits, c’est-Ă dire les clĂ©s qui produisent des identifiants uniques pour chaque ligne.
- Ces clĂ©s primaires ne permettent pas de crĂ©er des relations avec d’autres tables et ne sont habituellement d’aucun intĂ©rĂŞt dans les analyses.
- Un exemple d’une clĂ© primaire de table de faits est le numĂ©ro de facture.
- Évidemment, toutes les colonnes d’une table de faits qui contiennent des donnĂ©es d’affaires ou qui sont nĂ©cessaires pour crĂ©er des liens avec d’autres tables doivent ĂŞtre conservĂ©es.
- Toutes les colonnes gĂ©ographiques, par exemple, pourraient ĂŞtre fusionnĂ©es pour n’avoir qu’une seule colonne avec un IDGeographie.
- Toutes les colonnes d’une table de faits qui pourraient ĂŞtre dĂ©placĂ©es dans une table de dimensions, en crĂ©ant un schĂ©ma en Ă©toile (normalisation).
- Cette opĂ©ration n’a pas un gros impact sur la taille de la base de donnĂ©es, mais peut avoir un gros impact sur le temps de traitement et sur la consommation de mĂ©moire.
- Il ne faut pas aller trop loin non plus dans la normalisation puisque les relations entre les tables consomment aussi de la mĂ©moire et nĂ©cessitent souvent d’ajouter des colonnes (clĂ©s communes).
- Il faut viser un juste milieu.
- Toutes les colonnes numĂ©riques qui pourraient ĂŞtre regroupĂ©es en 2 colonnes seulement, une colonne de valeurs et une colonne d’Ă©tiquettes.
- Attention! Cette approche n’apporte pas toujours les rĂ©sultats escomptĂ©s!!!! Ça dĂ©pend des cas et surtout du nombre de valeurs distinctes dans la nouvelle colonne globale des valeurs.
Sur le site PowerPivot(Pro), on retrouve un article qui fournit un exemple de cette approche. En voici un extrait:
On débute avec une table de faits de 11 colonnes, dont 9 colonnes de valeurs et 700 000 lignes. Mettre à jour un important tableau croisé dynamique basé sur cette table prend environ 5,7 secondes.
On transforme ensuite la table en dĂ©pivotant les 9 colonnes de valeurs. On obtient ainsi une table avec, au total, 4 colonnes, puisque les 9 colonnes de donnĂ©es ont Ă©tĂ© transformĂ©es en 2 colonnes distinctes, soit une colonne de valeurs et une colonne d’Ă©tiquettes (qui prĂ©cise de quel type de valeur il s’agit).
De plus, on a ajouté au modèle de données une table avec la liste de toutes les étiquettes ainsi créées (i.e. tous les types de valeurs possibles) et on a créé une relation avec la table précédente.
Évidemment, pour obtenir la somme des ventes, il faudra ajuster notre mesure DAX en consĂ©quence (il faudra utiliser une fonction CALCULATE avec un filtre sur l’Ă©tiquette Ttl_Dollars) mais en bout de ligne, le mĂŞme tableau croisĂ© dynamique prend maintenant 2,4 secondes Ă se mettre Ă jour. Il y a donc un gain important.
Comment supprimer une colonne d’un modèle de donnĂ©es?
Voici la procédure pour supprimer une colonne dans un modèle de données.
D’abord, une fois vos sources de donnĂ©es sĂ©lectionnĂ©es, cliquez sur le bouton Preview and Filter, tel qu’illustrĂ© ci-dessous.
Vous aurez alors la possibilité de décocher les colonnes que vous ne souhaitez pas importer.
Comment dépivoter des colonnes?
- Utiliser Power Query
- Utiliser une vue avec les colonnes déjà dépivotées
- Si on ne veut pas jouer dans le code, il faut demander aux TI de prĂ©parer des vues de ce que l’on a vraiment besoin, mais Ă ce moment-lĂ , on passe un peu Ă cĂ´tĂ© du cĂ´tĂ© “libre” de l’expression “libre-service”.
- Utiliser un script SQL
- Le site PowerPivot(Pro) donne un exemple de script pour dépivoter des colonnes.
- Bien sĂ»r, ce ne sont pas tous les analystes qui sont Ă l’aise avec les requĂŞtes SQL. Voici donc une façon plus simple, pour les dĂ©butants, d’accĂ©der et de modifier un script SQL, Ă partir de Power Pivot.
D’abord, cliquez sur l’option Table Properties:
Choisissez ensuite l’option Query Editor dans le menu dĂ©roulant en haut, Ă droite:
DĂ©cochez au moins une colonne de votre table ou apposez un filtre Ă l’une ou l’autre de ses colonnes. Ceci modifiera la structure de la requĂŞte, qui passera d’un format agrĂ©gĂ©:
Ă un SELECT statement incluant le nom des colonnes:
Ă€ partir de lĂ , il vous sera plus facile de modifier le script. Vous trouverez d’ailleurs de nombreux articles de blogue Ă ce sujet.
2. Augmenter le nombre de colonnes
Quoi? Ne vient-on pas de dire exactement le contraire au point prĂ©cĂ©dent? Oui, mais il faut ĂŞtre vigilant et y aller cas par cas. En gĂ©nĂ©ral, il est prĂ©fĂ©rable d’avoir le moins de colonnes possible. Mais parfois, il est mieux d’avoir plusieurs colonnes avec un nombre respectable de valeurs uniques, qu’une seule colonne avec un large Ă©ventail de valeurs uniques. Donc, quand on a besoin d’une colonne qui comporte une quantitĂ© incroyable de valeurs uniques, il vaut mieux la diviser en plusieurs colonnes, de façon Ă ce que la somme de toutes les valeurs uniques de chacune des divisions soit infĂ©rieure Ă la quantitĂ© de valeurs uniques dans la colonne initiale.
D’ailleurs, sur le site PowerPivot(Pro), duquel j’ai tirĂ© l’exemple au point no.1, on fait la dĂ©monstration que dĂ©pivoter une table pour rĂ©duire le nombre de colonnes ne donne pas toujours les rĂ©sultats escomptĂ©s. Dans l’article PowerPivot Compression: Mysterious Ways, le fait de convertir 5 colonnes de valeurs en une colonne de valeurs et une colonne d’Ă©tiquettes augmente la taille du modèle rĂ©sultant. On y explique que cela est liĂ©, d’une part, au nombre Ă©levĂ© de lignes dans chaque table, et au fait que la colonne de valeurs globales ne soit pas triĂ©e. En triant cette colonne, la taille diminue effectivement, pour autant que l’on effectue le tri avant l’importation dans Power Pivot.
Rappelez-vous Ă©galement qu’il est plus facile de compresser des nombres entiers que d’autres types de donnĂ©es. Ce faisant, si vous pouvez fragmenter une colonne problĂ©matique en plusieurs colonnes avec des nombres entiers, ce serait l’idĂ©al. Par exemple, ci-bas, j’ai une table avec une colonne d’identifiants uniques et des valeurs.
En supposant que j’aie besoin des identifiants uniques dans mon analyse, je pourrais sĂ©parer chaque partie numĂ©rique de l’identifiant en 3 colonnes distinctes (ceci rĂ©duirait le nombre de valeurs distinctes totales et utiliserait le plus performant des types de compression, soit celui effectuĂ© sur des nombres entiers) et je pourrais ensuite les rĂ©unir en une seule valeur numĂ©rique (lĂ , on ne pourrait pas rĂ©duire le nombre de valeurs distinctes, mais on utiliserait le plus performant des types de compression, soit celui effectuĂ© sur des nombres entiers).
Vous constatez qu’il n’y a pas de solution unique. Il faut tester chaque cas de figure, en utilisant la logique.
Exemples de colonnes qui mĂ©ritent d’ĂŞtre fragmentĂ©es
- SĂ©parer une colonne qui comprend des montants composĂ©s de dollars et de cents en deux colonnes et les regrouper par le biais d’une mesure DAX par la suite TotalAmount= SUM([Dollars])+DIVIDE(SUM([Cents]),100). Cela rĂ©duit le nombre de valeurs uniques totales.
- SĂ©parer une colonne qui comprend des heures composĂ©es de dates et d’heures en deux colonnes et les regrouper par le biais d’une colonnes calculĂ©es par la suite.
3. Réduire le nombre de lignes
Il vaut mieux toujours penser Ă rĂ©duire le nombre de lignes Ă©galement, lorsque c’est possible.
Exemples de lignes qui mĂ©ritent d’ĂŞtre supprimĂ©es
- Des lignes de transactions d’une table de faits pour des annĂ©es historiques qui ne sont pas pertinentes pour l’analyse ou pour un volet de l’entreprise qui n’a pas besoin d’ĂŞtre analysĂ©.
- Des lignes d’une table de dates pour des dates qui ne sont pas pertinentes pour l’analyse, par exemple, les annĂ©es historiques.
- Si vous laissez toutes les années dans le modèle de données, Power Pivot fait ses calculs pour toutes les années de la table de dates. Ça peut sérieusement affecter la performance.
- Vous empirez la situation lorsque vous ajoutez des mesures de temps comme PriorYear, YeartoDate, PriorYeartoDate, etc. et/ou que vous ajoutez ensuite des segments (slicers) sur ces calculs.
Supprimer des lignes d’un modèle de donnĂ©es
Voici la procédure pour supprimer des lignes dans un modèle de données.
Vous devez vous rendre encore dans la section Preview et Filter mais cette fois-ci, vous devez utiliser les menus dĂ©roulants pour apposer vos filtres. Dans l’exemple ci-dessous, nous pouvons filtrer notre table de donnĂ©es selon les dates que nous souhaitons conserver. Nous pourrions choisir d’importer toute la dernière annĂ©e, les deux dernières annĂ©es, etc.
4. Optimiser le poids d’une colonne
Pour les colonnes dont vous avez absolument besoin, sachez qu’il existe quelques techniques qui permettent d’optimiser la compression d’une colonne. Il s’agit toujours de rĂ©duire au maximum le nombre de valeurs uniques dans cette colonne.
Exemples de colonnes à optimiser en réduisant la granularité
- Modifier les colonnes avec des valeurs qui comprennent une portion date et une portion temps
- Vérifier si vous avez besoin de la portion temps
- Vérifier si vous avez besoin de la portion temps en heures? en minutes? en secondes? en milisecondes?
- Vérifier si vous devez calculer des différences entre différentes colonnes de dates et de temps ou si vous avez simplement besoin de regrouper vos données par années, mois, trimestre, etc.
- Vous avez un exemple complet ici qui enseigne comment modifier le script SQL en ce sens: Create Efficient Data Model using Excel 2013 and the Power Pivot Add-in
- Réduire le nombre de décimales (peut avoir un impact significatif)
5. Remplacer des colonnes ou des colonnes calculées par des mesures DAX
Il peut s’avĂ©rer efficace de remplacer des colonnes rĂ©gulières ou des colonnes calculĂ©es par des mesures. Par exemple, une table qui possède une colonne UnitPrice et Quantity n’a pas besoin d’une colonne TotalSales. TotalSales peut ĂŞtre dĂ©finie par une mesure DAX.
TotalSales:=SUMX(SalesTable,SalesTable[UnitPrice]*SalesTable[Quantity])
Les colonnes calculĂ©es sont comme des colonnes rĂ©gulières, dans le sens oĂą les deux occupent de l’espace dans le modèle. Ă€ l’inverse, les mesures sont calculĂ©es au moment d’une requĂŞte. Si le mĂŞme calcul peut ĂŞtre dĂ©fini par une colonne calculĂ©e ou par une mesure, la dernière option est meilleure d’un point de vue de consommation de ressources. Par contre, les mesures peuvent entraĂ®ner des dĂ©lais au moment des requĂŞtes par les usagers. Il faut donc écrire les mesures les plus efficaces possibles. Il faut aussi prendre conscience qu’un filtre (un segment par exemple) peut affecter plusieurs tables et donc plusieurs mesures Ă la fois, augmentant d’autant le temps de traitement.
En somme, les colonnes calculĂ©es sont recalculĂ©es au rafraĂ®chissement de la source. Ceci signifie que ça prend plus de temps Ă l’ouverture. Les mesures sont recalculĂ©es lors d’une requĂŞte (en utilisant des filtres), ce qui retarde la mise Ă jour du tableau de bord, par exemple. Ceci peut dĂ©ranger les usagers. Mais en gĂ©nĂ©ral, on recommande nĂ©anmoins de remplacer les colonnes calculĂ©es par des mesures.
De plus, chaque cellule d’un tableau croisĂ© dynamique est calculĂ©e indĂ©pendamment, donc plus vous ajoutez de dĂ©tails dans le TCD (des sous-catĂ©gories, par exemple), plus vous compliquez les choses.
- L’article suivant vous prĂ©sente comment utiliser le DAX lorsque vous devez prĂ©senter un tableau croisĂ© dynamique dĂ©taillé et passer de 192 000 calculs Ă 1 calcul: Using DAX to retrieve tabular data
6. Optimiser l’usage des segments (slicers)
Certains d’entre vous rencontrez des problèmes de performance lorsque vous effectuez des requĂŞtes sur votre modèle de donnĂ©es, notamment par le biais de segments (slicers) dans Excel. Voici donc ce que vous devez savoir sur les segments:
- Chaque segment envoie 2 requêtes
- 1 requĂŞte envers lui-mĂŞme pour savoir s’il doit ajouter/supprimer/modifier ses boutons.
- 1 requête en fonction des autres segments (cross-slicers filtering).
- Excel essaie de faire correspondre toutes les valeurs du deuxième segment au premier et n’affiche que les rĂ©sultats correspondants (ça demande beaucoup de travail).
- Excel fait ça pour tous les segments, à chaque modification. Quelques filtres croisés (cross-slicers filtering) peuvent brimer considérablement la performance (de 5 à 10 fois, parfois même plus).
Fort de cette connaissance, vous pouvez en conclure que:
- Chaque fois que vous ajoutez un segment dans un rapport, vous faites aussi en sorte que les requĂŞtes gĂ©nĂ©rĂ©es par les autres segments deviennent plus complexes, donc, retirer un segment peut permettre aux autres segments d’ĂŞtre plus performants.
- Vous pouvez remplacer les segments par des filtres de rapports traditionnels au besoin (vous pouvez relire l’article ContrĂ´ler plusieurs tableaux croisĂ©s dynamiques avec un seul menu dĂ©roulant pour vous inspirer Ă ce sujet).
Vous pouvez également réduire les segments croisés ou fermer cette option:
- Il est judicieux d’utiliser des mesures DAX plus performantes. Par exemple, la fonction FILTER va tirer plus de jus qu’un simple SUM. En effet, la mesure FILTER devra se mettre Ă jour par rapport au tableau croisĂ© dynamique, mais Ă©galement par rapport Ă chaque segment.
- Utiliser le segment sur la table de faits plutĂ´t que la table de dimension peut ralentir Ă©normĂ©ment le traitement des donnĂ©es. Par exemple, si vous utilisez un segment de dates Ă partir de la colonne dates d’une table de faits (plutĂ´t que la colonne date de la table de dates) vous demandez au segment de se mettre Ă jour en Ă©tudiant chaque ligne de la table de faits plutĂ´t que la table de dates (vous augmentez donc le temps de traitement).
- Mais attention! LĂ aussi, il y a des exceptions. Voici un exemple oĂą le fait d’utiliser le segment sur la table de dimensions plutĂ´t que sur la table de faits n’a pas l’effet escomptĂ©, Ă cause du schĂ©ma snowflake (table intermĂ©diaire dans le chemin): Stars and Snowflakes and Bears Oh My
- Les schémas en étoile (star schema) sont donc plus efficaces que les schémas en flocons de neige (snowflake schema)
Outils
Il existe différents outils pour vous aider à améliorer la performance de vos modèles de données.
- Le Workbook Size Optimizer inspecte vos modèles de donnĂ©es Ă©laborĂ©s dans Power Pivot, Ă©value si ceux-ci peuvent occuper moins d’espace et, le cas Ă©chĂ©ant, amĂ©liore la compression.
- Vous pouvez Ă©galement utiliser un fichier Shema.ini pour prĂ©ciser le format de vos fichiers texte dès l’importation dans Power Pivot.
- Une macro rĂ©digĂ©e par Kasper de Jonge permet d’analyser votre modèle de donnĂ©es et de fournir un onglet comme le suivant, prĂ©cisant comment chaque Ă©lĂ©ment de votre modèle de donnĂ©es consomme de mĂ©moire.
Références:
Power Pivot Performance Gotchas
Slicers and Pivot Update Performance
Less Columns, More Rows, More Speed
Power Pivot Compression Mysterious Ways
Speed: Another Reason to Trim Calendar Tables
The High Cost of Poor Equipment
Performance Tips for your Power Pivot Sheet
Checklist for Memory Optimizations in Power Pivot and Tabular Models
Power Pivot Tips and Tricks for IT Pros
Create Efficient Data Model using Excel 2013 and the Power Pivot Add-in
Fichier d’accompagnement
Pour télécharger le fichier utilisé dans ce tutoriel, devenez membre VIP du CFO masqué.
Formation complémentaire
Pour une introduction à la modélisation de données avec Power Pivot, un complément BI d’Excel, qui permet d’importer, de croiser et de bonifier diverses sources de données externes pour finalement les analyser à l’aide de tableaux croisés dynamiques, suivez la formation Excel – Excel – Introduction à Power Pivot et aux modèles de données.
Voici quelques commentaires d’apprenants ayant suivi cette formation :
La mission du CFO masqué est de développer les compétences techniques des analystes et des contrôleurs de gestion en informatique décisionnelle avec Excel et Power BI et favoriser l’atteinte de leur plein potentiel, en stimulant leur autonomie, leur curiosité, leur raisonnement logique, leur esprit critique et leur créativité.
Vraiment très intéressant et complet.
Merci pour cet article technique mais extrĂŞmement utile.