Réduire la cardinalité pour améliorer les performances
Même avec DAX optimisé, un modèle sémantique peut être lent s’il contient trop de données. La cardinalité (le nombre de valeurs uniques dans une colonne) affecte directement la taille du modèle, la consommation de mémoire et les performances des requêtes. La réduction de la cardinalité est l’une des façons les plus efficaces de rendre un modèle plus rapide.
Comprendre comment la cardinalité affecte les performances
Les modèles sémantiques utilisent un moteur de compression en mémoire appelé VertiPaq, qui compresse la colonne de données par colonne. Les colonnes avec moins de valeurs uniques compressent mieux et interrogent plus rapidement. Une colonne avec 10 valeurs uniques compresse beaucoup plus efficacement qu’une colonne avec 10 millions de valeurs uniques.
Les colonnes à cardinalité élevée créent deux problèmes :
- Taille de modèle plus grande. Des valeurs plus uniques nécessitent davantage de stockage, ce qui augmente l’utilisation de la mémoire et peut ralentir l’actualisation des données.
- Requêtes plus lentes. Le moteur doit traiter des valeurs plus distinctes lors du filtrage, du regroupement ou de l’agrégation. Les colonnes à cardinalité élevée dans les relations augmentent également le coût de la jointure des tables.
Pensez-y de cette façon : si votre modèle est un dictionnaire, la cardinalité est le nombre de mots uniques. Un dictionnaire avec un million d’entrées prend plus de temps pour rechercher qu’un avec mille.
Identifier les colonnes à cardinalité élevée
Toutes les colonnes ne contribuent pas de façon égale à la taille du modèle. Pour trouver les plus grands délinquants, recherchez des colonnes avec ces caractéristiques :
- Les GUID ou clés de substitution qui ne sont pas utilisés dans les relations ou les rapports. Ceux-ci sont souvent chargés par défaut, mais ne servent aucun objectif dans le modèle.
- Horodatages avec une précision élevée. Une colonne datetime qui stocke les valeurs en millisecondes a beaucoup plus de valeurs uniques qu’une colonne de date qui stocke les valeurs au niveau du jour.
- Colonnes de texte libre ou de description. Les colonnes de texte avec des valeurs uniques par ligne (telles que des descriptions de transaction ou des commentaires) se compressent mal.
- Identificateurs uniques tels que les numéros de commande, les numéros de facture ou les ID de session qui ne sont pas nécessaires pour la création de rapports.
Dans Power BI Desktop, vous pouvez examiner les statistiques des colonnes dans la vue modèle. La préversion des données dans Power Query affiche également des nombres de valeurs distincts pendant la transformation.
Appliquer des stratégies de réduction
Une fois que vous avez identifié des colonnes à cardinalité élevée, appliquez une ou plusieurs de ces stratégies :
Supprimez les colonnes inutilisées. Si une colonne n’est pas utilisée dans les relations, les mesures, les visuels ou les rôles de sécurité, ne l’importez pas. Il s’agit parfois d’un filtrage vertical. Passez en revue régulièrement votre modèle pour vous assurer que chaque colonne a un objectif.
Réduisez la précision temporelle. Si le reporting ne nécessite qu’une granularité quotidienne, tronquez les colonnes de date-heure à la date dans Power Query avant le chargement. Passer de datetime (millions de valeurs uniques) à date (quelques milliers) réduit considérablement la cardinalité.
Regroupez les valeurs continues. Regroupez des valeurs numériques continues en plages. Par exemple, au lieu de stocker exactement les âges (0 à 120), créez des groupes d’âge tels que « 18-25 », « 26-35 » et « 36-45 ». Cela réduit les valeurs uniques tout en préservant la valeur analytique.
Supprimez les lignes inutiles. Filtrez les données historiques qui ne sont plus nécessaires pour la création de rapports. Si les utilisateurs analysent uniquement les deux dernières années, ne chargez pas cinq ans de données. Il s’agit d’un filtrage horizontal et réduit à la fois la cardinalité et le nombre global de lignes.
Optimisez les types de données de colonne. Le moteur VertiPaq utilise l’encodage de valeur pour les données numériques (hautement efficaces) et l’encodage de hachage pour le texte (moins efficace). Si une colonne comme numéro de commande est stockée sous forme de texte avec un préfixe (par exemple, « SO123456 »), envisagez de supprimer le préfixe et de le stocker en tant que nombre.
Conseil / Astuce
Préférez créer des colonnes calculées dans Power Query par rapport aux colonnes calculées DAX. Les colonnes Power Query sont traitées pendant la charge des données et bénéficient d’une meilleure compression VertiPaq. Les colonnes calculées DAX sont évaluées après le chargement et sont généralement moins efficaces en termes de compression.
Évaluer les compromis
La réduction de la cardinalité implique toujours un compromis entre granularité et performances. Arrondir les horodatages au niveau de la journée signifie que vous ne pouvez pas analyser les modèles intra-jour. Le regroupement des âges signifie que vous ne pouvez pas filtrer sur des âges précis. Ces décisions doivent être pilotées par les exigences métier.
Posez-vous ces questions avant de réduire la cardinalité :
- Un rapport, un segment ou une mesure dépend-il de ce niveau de détail ?
- Les utilisateurs peuvent-ils obtenir les détails dont ils ont besoin à partir d’une page d’extraction connectée à une table DirectQuery ?
- La colonne est-elle utilisée dans les règles de sécurité au niveau des lignes ?
Lorsque l’entreprise nécessite à la fois des performances de synthèse et un accès au niveau des détails, une approche de modèle composite peut vous aider. Utilisez le mode Importation de stockage pour les données résumées (requêtes rapides) et DirectQuery pour l’extraction au niveau des détails (accès à la demande à la source).