Optimisation des performances des cubes OLAP
Indexation et partitionnement des tables
1. L’indexation
Comme évoqué dans les chapitres précédents, un cube OLAP doit être capable d’encaisser de très gros volumes de données, plusieurs millions de lignes sont fréquentes, tout en restant utilisable au quotidien. Et ce n’est pas un luxe : les volumes évoluent au rythme de l’entreprise, et un cube mal pensé peut vite devenir un cauchemar à interroger.
Pour garder un minimum de confort côté utilisateur, il faut recourir à différentes techniques d’optimisation. Les deux plus répandues sont l’indexation et le partitionnement. On pourrait dire que ce sont les deux piliers qui permettent d’éviter que le cube ne s’écroule sous son propre poids.
L’indexation (cf. chapitre Optimiser les relations faits et dimensions - Réduction des jointures complexes et optimisation des performances) reste un mécanisme central dans les SGBD. L’idée est assez intuitive : au lieu de balayer toute une table ligne par ligne, on s’appuie sur une structure de recherche qui donne accès directement aux enregistrements visés. C’est un peu comme une table des matières, il n’est pas nécessaire de relire chaque page pour retrouver un chapitre.
Dans un entrepôt de données, deux types d’index reviennent très souvent :
Index sur les clés primaires et étrangères
Les requêtes OLAP reposent presque toujours sur des jointures entre la table de faits et les tables de dimensions. Sans index, ces jointures deviennent vite très coûteuses. L’index sur clé primaire (généralement créé automatiquement par le SGBD) permet déjà de pointer rapidement vers une ligne précise. Mais ce n’est pas suffisant dans des scénarios complexes : il faut aussi indexer les clés étrangères dans la table de faits. Cela évite au moteur de parcourir des millions de lignes pour retrouver, par exemple, l’identifiant d’un produit dans sa dimension associée.Dans ce contexte, les index B-TREE sont les plus répandus. Ils conviennent particulièrement bien aux colonnes avec une forte cardinalité (par exemple...
Techniques de pré-agrégation et stockage en cache
1. Pré-agrégation
Lors du paragraphe précédent, nous avons parlé d’indexation et de partitionnement : deux leviers classiques qui changent déjà le quotidien d’un entrepôt. L’indexation raccourcit le chemin vers les lignes utiles, le partitionnement réduit le volume scanné en calant les lectures sur des tranches de temps, de région ou de tout autre axe dominant. Bien utile mais rarement suffisant, dès que les requêtes multiplient les jointures, les fenêtres temporelles et les granularités hétérogènes. C’est précisément à ce moment-là que la pré-agrégation et le stockage en cache entrent en scène.
La pré-agrégation consiste en le calcul en amont des totaux, moyennes, comptes distincts, percentiles … sur des niveaux de détail choisis, pour éviter de repasser en permanence sur des centaines de millions de lignes. Le cache, lui, évite de recommencer quand la même chose est redemandée. L’un réduit le travail, l’autre supprime la répétition. Ils n’ont pas la même utilité ni les mêmes challenges.
Pour mettre en place une pré-agrégation pertinente, les étapes suivantes seront essentielles.
a. Sélection des agrégats à pré-agréger
Identifier, sur 4 à 6 semaines de requêtes, 10 à 20 GROUP BY dominants avec le plus de fréquence, latence et faible coût de stockage.
Exemple : un fait « Ventes » avec 400 millions de lignes annuelles, cinq dimensions principales :
-
Date -> Mois -> Trimestre -> Année
-
Produit -> Catégorie
-
Magasin -> Ville-> Région
-
Canal
-
Promotion
Les tableaux de bord consultent 8 fois sur 10 « Ventes mensuelles par catégorie et région ». Conserver à l’avance ce niveau (Mois * Catégorie * Région) économise un scan coûteux et permet de répondre en 200-400 ms au lieu de 8-12 s.
Plusieurs coûts cachés : stockage supplémentaire, maintenance lors des chargements (incréments, corrections, retards d’intégration)....
Optimisation des temps de réponse des requêtes MDX
1. Indexation des structures multidimensionnelles
La structure OLAP, quel que soit la technologie utilisée, propose un ensemble de mécanismes d’indexation interne qui influencent directement sur les temps de réponse des requêtes MDX. Ils tiennent surtout à la façon dont le moteur OLAP voit les données : pré-agrégations, relations hiérarchiques internes, élimination de partitions, et aussi (en ROLAP/ HOLAP) aux index du SGBD sous-jacent.
a. Pré-agrégations du cube (Aggregation Design/Aggregate Views)
En théorie, on matérialise à l’avance des totaux à certains niveaux (Année, Catégorie…) pour éviter de tout recalculer à la volée.
En SSAS Multidimensionnel, cela se fait via un Aggregation Designattaché aux partitions ; on peut le générer par l’assistant ou par la commande XMLA DesignAggregations, alors que sur Essbase (ASO) l’équivalent des aggregate views sont sélectionnées et construites par MaxL (l’équivalent du MDX sur Essbase).
L’idée est la même : précalculer ce qu’on interroge souvent, en contrôlant le compromis « granularité <-> espace disque ».
En exemple AdventureWorks : pour la mesure internet Sales Amount agrégé par [Date].[Calendar].[Year] et [Product].[Category], on conçoit un design ciblant ces attributs.
Pour SSAS, ci-après un exemple de script XMLA de création et de design des agrégations :
<Batch xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
<Commands>
<!-- 1) Créer (ou écraser) un AggregationDesign vide -->
<Create AllowOverwrite="true">
<ObjectDefinition>
<AggregationDesign>
<ID>Agg_InternetSales_Year_Category</ID>
<Name>Agg_InternetSales_Year_Category</Name>
<Annotations/>...Bonnes pratiques pour la maintenance et l’évolution des cubes
Un cube OLAP peut évoluer très rapidement que ce soit en termes de volume de données ou bien en termes d’utilisation et suit de très près l’évolution de l’entreprise. Pour cela il est très important de suivre les bonnes pratiques afin de mieux le maintenir et accompagner son évolution.
Ce chapitre a mis en lumière les techniques d’optimisation des cubes. Pour rappel, on a parlé de :
-
Pré-agrégations pour éviter les recalculs systématiques.
-
Les attributs de relations pour optimiser les parcours (descendants, children…), Rigid si possible.
-
Index coté SGBD en ROLAP/HOLAP (columnstore SQL Server, bitmap Oracle).
-
Partitions + slice pour éliminer ce qui ne sert pas.
-
Vues matérialisées pour optimiser le moteur en ROLAP.
-
Essbase ASO : hierarchies stored vs Dynamic et sélection de vues d’agrégats.
Un point important, souvent oublié jusqu’à ce que les performances s’effondrent, concerne la maintenance invisible des index et des statistiques au niveau du SGBD sous-jacent. C’est une tâche d’arrière-plan essentielle. La fragmentation des index, particulièrement les B-TREE, est un ennemi silencieux. Avec les insertions et mises à jour (notamment sur les dimensions...