Introduction
Les alertes peuvent également tirer parti des vues matérialisées, et en bénéficier automatiquement.
Cela peut réduire la surcharge de calcul liée à l’exécution d’un grand nombre d’alertes, d’autant plus qu’elles s’exécutent généralement très fréquemment.
Réduire le temps d’exécution peut être bénéfique à la fois pour la réactivité et pour la consommation de ressources.
Que sont les vues matérialisées incrémentielles
SELECT.
Contrairement aux bases de données transactionnelles comme Postgres, une vue matérialisée ClickHouse n’est pas un instantané stocké. Elle agit plutôt comme un déclencheur qui exécute une requête sur des blocs de données lorsqu’ils sont insérés dans une table source. Le résultat de cette requête est écrit dans une table cible distincte. À mesure que des données supplémentaires sont insérées, de nouveaux résultats partiels sont ajoutés puis fusionnés dans la table cible. Le résultat fusionné équivaut à exécuter l’agrégation sur l’ensemble du jeu de données d’origine.
La principale raison d’utiliser des vues matérialisées est que les données écrites dans la table cible représentent le résultat d’une agrégation, d’un filtrage ou d’une transformation. Dans ClickStack, elles sont utilisées exclusivement pour les agrégations. Ces résultats sont généralement bien plus petits que les données brutes d’entrée et représentent souvent des états d’agrégation partiels. Combiné à la simplicité d’interroger la table cible pré-agrégée, cela permet de réduire considérablement la latence des requêtes par rapport à l’exécution du même calcul sur des données brutes au moment de la requête.
Les vues matérialisées dans ClickHouse sont mises à jour en continu à mesure que les données arrivent dans la table source et se comportent davantage comme des index toujours à jour. Cela diffère de nombreuses autres bases de données, où les vues matérialisées sont des instantanés statiques qui doivent être actualisés périodiquement, comme les Refreshable Materialized Views de ClickHouse.
Les vues matérialisées incrémentielles ne calculent que les modifications de la vue à mesure que de nouvelles données arrivent, en déplaçant le calcul au moment de l’insertion. Comme ClickHouse est hautement optimisé pour l’ingestion, le coût incrémental de maintenance de la vue pour chaque bloc inséré reste faible par rapport aux gains obtenus lors de l’exécution des requêtes. Le coût du calcul de l’agrégation est amorti sur les insertions au lieu d’être payé de nouveau à chaque lecture. Interroger les résultats pré-agrégés coûte donc bien moins cher que de les recalculer, ce qui réduit les coûts d’exploitation et offre des performances quasi en temps réel pour les visualisations en aval, même à l’échelle du pétaoctet.
Ce modèle diffère fondamentalement des systèmes qui recalculent des vues entières à chaque mise à jour ou s’appuient sur des actualisations planifiées. Pour une explication plus détaillée du fonctionnement des vues matérialisées et de leur création, reportez-vous au guide lié ci-dessus.
Chaque vue matérialisée introduit une surcharge supplémentaire au moment de l’insertion et doit donc être utilisée avec discernement.
Une seule vue matérialisée peut calculer plusieurs métriques pour différents regroupements, par exemple la durée minimale, maximale et le p95 par nom de service sur des intervalles d’une minute. Cela permet à une seule vue d’alimenter de nombreuses visualisations plutôt qu’une seule. Il est donc important de regrouper les métriques dans des vues partagées afin de maximiser la valeur de chaque vue et de garantir sa réutilisation dans les tableaux de bord et les workflows.
Sélection des visualisations à accélérer
Identifier les visualisations à fort impact
- Les visualisations de tableau de bord qui s’actualisent fréquemment et restent affichées en permanence, comme les tableaux de bord de monitoring de haut niveau affichés sur des écrans muraux.
- Les workflows de diagnostic utilisés dans les runbooks, où certains graphiques sont consultés à plusieurs reprises pendant la gestion d’un incident et doivent renvoyer rapidement des résultats.
- Les usages clés de HyperDX, notamment :
- Les vues d’histogramme sur la page Search.
- Les visualisations utilisées dans les tableaux de bord prédéfinis, comme les vues APM, Services ou Kubernetes.
Équilibrer les bénéfices et le coût à l’insertion
Avant de passer en production, validez toujours la surcharge en ressources introduite par les vues matérialisées, en particulier l’utilisation du CPU, les E/S disque et l’activité de fusion. Chaque vue matérialisée augmente le travail à l’insertion et génère des parts supplémentaires ; il est donc important de s’assurer que les fusions suivent le rythme et que le nombre de parts reste stable. Cela peut être surveillé via les tables système et le tableau de bord d’observabilité avancé intégré dans ClickHouse open-source, ou à l’aide des métriques intégrées et des tableaux de bord de monitoring dans ClickHouse Cloud. Consultez Too many parts pour obtenir des conseils sur le diagnostic et la réduction d’un nombre excessif de parts.
toStartOfMinute. Cependant, de nombreuses visualisations partagent aussi des clés de regroupement supplémentaires, comme le nom du service, le nom du span ou le code d’état. Lorsque plusieurs visualisations utilisent les mêmes dimensions de regroupement, elles peuvent souvent s’appuyer sur une seule vue matérialisée.
Par exemple (pour les traces) :
- Durée moyenne par nom de service au fil du temps -
SELECT avg(Duration), toStartOfMinute(Timestamp) as time, ServiceName FROM otel_traces GROUP BY ServiceName, time - Nombre de requêtes par nom de service au fil du temps -
SELECT count() count, toStartOfMinute(Timestamp) as time, ServiceName FROM otel_traces GROUP BY ServiceName, time - Durée moyenne par code d’état au fil du temps -
SELECT avg(Duration), toStartOfMinute(Timestamp) as time, StatusCode FROM otel_traces GROUP BY StatusCode, time - Nombre de requêtes par code d’état au fil du temps -
SELECT count() count, toStartOfMinute(Timestamp) as time, StatusCode FROM otel_traces GROUP BY StatusCode, time
Création d’une vue matérialisée
Lorsqu’aucun panneau de débogage n’est disponible dans HyperDX pour un composant, les utilisateurs peuvent inspecter la console du navigateur, où toutes les requêtes sont consignées.
AggregatingMergeTree :
Vous trouverez ci-dessous un exemple d’utilisation d’AggregatingMergeTree et des fonctions d’agrégation :
Exemple de vue matérialisée
otel_traces_1m qui stocke les états d’agrégation correspondants :
otel_traces_1m_mv - calcule ensuite ces états et les enregistre à mesure que de nouvelles données sont insérées :
- La table cible, qui définit le schéma et les types d’état d’agrégation utilisés pour stocker les résultats intermédiaires. Le moteur AggregatingMergeTree est nécessaire pour garantir que ces états sont correctement fusionnés en arrière-plan.
- La requête de la vue matérialisée s’exécute automatiquement lors de l’insert. Par rapport à la requête d’origine, elle utilise des fonctions d’état telles que
avgStateetquantilesStateau lieu des fonctions d’agrégation finales.
Utilisation des vues matérialisées dans ClickStack
Enregistrement d’une vue matérialisée pour utilisation
Modifier la source
Accédez à la source concernée dans HyperDX et ouvrez la boîte de dialogue Edit configuration. Faites défiler jusqu’à la section des vues matérialisées.Ajouter la vue matérialisée
Sélectionnez Add materialized view, puis choisissez la base de données et la table cible sur lesquelles repose la vue matérialisée.Sélectionner les métriques
Dans la plupart des cas, les colonnes d’horodatage, de dimension et de métrique seront déduites automatiquement. Sinon, spécifiez-les manuellement.Pour les métriques, vous devez faire correspondre :- le nom de la colonne d’origine, par exemple
Duration, avec - la colonne d’agrégation correspondante dans la vue matérialisée, par exemple
avg__Duration
Sélectionner la granularité temporelle
Sélectionnez la granularité temporelle de la vue matérialisée, par exemple une minute.Sélectionner la date minimale
Spécifiez la date minimale pour laquelle la vue matérialisée contient des données. Cela correspond à l’horodatage le plus ancien disponible dans la vue et, en général, au moment où la vue a été créée, en supposant que l’ingestion a été continue.Les vues matérialisées ne sont pas automatiquement rétroremplies lors de leur création ; elles ne contiendront donc que les lignes générées à partir des données insérées après leur création.
Un guide complet sur le rétroremplissage des vues matérialisées est disponible dans “Rétroremplir des données.”
Enregistrer la source
Enregistrez la configuration de la source.Vérifier l’accélération dans les tableaux de bord et les visualisations
ClickStack n’utilisera une vue matérialisée que si son horodatage minimum est inférieur ou égal au début de l’intervalle de temps de la requête, ce qui garantit que la vue contient toutes les données requises. Bien que les requêtes soient divisées en interne en sous-requêtes basées sur le temps, les vues matérialisées sont appliquées soit à l’ensemble de la requête, soit pas du tout. De futures améliorations pourraient permettre d’utiliser les vues de manière sélective pour les sous-requêtes admissibles.
- Vérifiez l’état de l’optimisation Lorsque vous consultez un tableau de bord ou une visualisation, recherchez l’icône en forme d’éclair ou l’icône
Accelerated:
- Éclair vert indique que la requête est accélérée par une vue matérialisée.
- Éclair orange indique que la requête est exécutée sur la table source.
- Inspectez les détails de l’optimisation Cliquez sur l’icône en forme d’éclair pour ouvrir un panneau de détails affichant :
- Vue matérialisée active : la vue sélectionnée pour la requête, y compris son nombre estimé de lignes.
- Vues matérialisées ignorées : les vues compatibles qui n’ont pas été sélectionnées, ainsi que leurs tailles d’analyse estimées.
- Vues matérialisées incompatibles : les vues qui n’ont pas pu être utilisées, ainsi que la raison précise.
- Comprenez les raisons courantes d’incompatibilité Une vue matérialisée peut ne pas être utilisée si :
- L’intervalle de temps de la requête commence avant l’horodatage minimum de la vue.
- La granularité de la visualisation n’est pas un multiple de la granularité de la vue.
- La fonction d’agrégation demandée par la requête n’est pas présente dans la vue.
- La requête utilise des expressions de comptage personnalisées, telles que
count(if(...)), qui ne peuvent pas être dérivées des états d’agrégation de la vue.
Comment les vues matérialisées sont sélectionnées pour les visualisations
EXPLAIN ESTIMATE de ClickHouse.
Le processus de sélection suit une séquence bien définie :
-
Valider la compatibilité
ClickStack détermine d’abord si une vue matérialisée peut être utilisée pour la requête en vérifiant :
- Couverture temporelle : l’intervalle de temps de la requête doit être entièrement compris dans la plage de données disponible de la vue matérialisée.
- Granularité : le bucket temporel de la visualisation doit être égal ou plus grossier que la granularité de la vue.
- Agrégations : les métriques demandées doivent être présentes dans la vue et calculables à partir de ses états d’agrégation.
-
Transformer la requête
Pour les vues compatibles, ClickStack réécrit la requête afin de cibler la table de la vue matérialisée :
- Les fonctions d’agrégation sont mappées aux colonnes matérialisées correspondantes.
- Les combinateurs
-Mergesont appliqués aux états d’agrégation. - Le regroupement temporel est ajusté pour s’aligner sur la granularité de la vue.
-
Sélectionner le meilleur candidat
Si plusieurs vues matérialisées compatibles sont disponibles, ClickStack exécute une requête
EXPLAIN ESTIMATEpour chaque candidat et compare le nombre estimé de lignes et de granules analysés. La vue dont le coût d’analyse estimé est le plus faible est sélectionnée. - Repli automatique Si aucune vue matérialisée n’est compatible, ClickStack revient automatiquement à la table source.
Exemple de sélection de vues matérialisées
otel_traces_1m, regroupée par minute,ServiceNameetStatusCodeotel_traces_1m_v2, regroupée par minute,ServiceName,StatusCodeetSpanName
EXPLAIN ESTIMATE pour chaque vue candidate et compare le nombre estimé de granules, c.-à-d. :
otel_traces_1m est plus petite et analyse moins de granules, elle est sélectionnée automatiquement.
Les deux vues matérialisées restent plus performantes qu’une interrogation directe de la table de base, mais choisir la plus petite vue adaptée offre les meilleures performances.
Alertes
Rétroremplissage d’une vue matérialisée
Approches de rétroremplissage
Évitez POPULATEL’utilisation de la commande POPULATE n’est pas recommandée pour le rétroremplissage des vues matérialisées, sauf pour de petits jeux de données lorsque l’ingestion est en pause. Cette opération peut manquer des lignes insérées dans la table source, car la vue matérialisée n’est créée qu’une fois la phase de population terminée. En outre, POPULATE s’exécute sur l’ensemble des données et reste sensible aux interruptions ainsi qu’aux limites de mémoire sur de grands jeux de données.
Rétroremplissage direct à l’aide de INSERT INTO SELECT
Déterminer la couverture actuelle de la vue
Avant de tenter un rétroremplissage, commencez par déterminer quelles données la vue matérialisée contient déjà. Pour cela, interrogez le timestamp minimal présent dans la table cible :Décider si un rétroremplissage est nécessaire
Dans la plupart des déploiements ClickStack, les requêtes portent sur des données récentes, par exemple celles des dernières 24 heures. Dans ce cas, les vues nouvellement créées deviennent pleinement exploitables peu après leur création, et le rétroremplissage n’est pas nécessaire.Si le timestamp renvoyé à l’étape précédente est suffisamment ancien pour vos cas d’usage, aucun rétroremplissage n’est nécessaire. Le rétroremplissage ne doit être envisagé que dans les cas suivants :- Les requêtes couvrent fréquemment de longues périodes historiques.
- La vue est essentielle pour les performances sur ces périodes.
- La taille du jeu de données et le coût de l’agrégation rendent le rétroremplissage faisable.
Rétroremplir les données historiques manquantes
Si un rétroremplissage est nécessaire, alimentez la table cible de la vue matérialisée pour les timestamps antérieurs au minimum actuel en utilisant la requête de la vue, modifiée pour ne lire que les données plus anciennes que le timestamp relevé ci-dessus. Comme la table cible utilise AggregatingMergeTree, la requête de rétroremplissage doit insérer des états d’agrégation, et non des valeurs finales.Notez que la requête suivante ajoute une clauseWHERE pour limiter l’agrégation aux données plus anciennes que le timestamp le plus ancien présent dans la vue :Rétroremplissage incrémental à l’aide d’une table Null
INSERT INTO SELECT peut être peu pratique, voire risqué. Dans ce cas, il est recommandé d’adopter une approche de rétroremplissage incrémental. Cette méthode reproduit plus fidèlement le fonctionnement habituel des vues matérialisées incrémentales, en traitant les données par blocs de taille raisonnable plutôt qu’en agrégeant tout l’historique en une seule fois.
Cette approche est appropriée lorsque :
- La requête de rétroremplissage s’exécuterait autrement pendant de nombreuses heures.
- Le pic d’utilisation mémoire d’une agrégation complète est trop élevé.
- Vous souhaitez maîtriser finement la consommation de CPU et de mémoire pendant le rétroremplissage.
- Vous avez besoin d’un processus plus résilient, qui puisse redémarrer en toute sécurité en cas d’interruption.
Créer une table Null pour le rétroremplissage
Créez une table Null légère qui ne contient que les colonnes requises par l’agrégation de la vue matérialisée. Cela minimise les E/S et l’utilisation mémoire.Attacher une vue matérialisée à la table Null
Créez ensuite une vue matérialisée sur la table Null qui cible la même table d’agrégation que votre vue matérialisée principale.Charger les données de façon incrémentale
Enfin, insérez les données historiques dans la table Null. La vue matérialisée traitera les données bloc par bloc, en envoyant les états d’agrégation vers la table cible sans stocker les lignes brutes.Pour plus de sûreté, vous pouvez faire pointer la vue matérialisée de rétroremplissage vers une table cible temporaire (par exemple,
otel_traces_1m_v2). Une fois le rétroremplissage terminé avec succès, les partitions peuvent être déplacées vers la table cible principale, par ex. ALTER TABLE otel_traces_1m_v2 MOVE PARTITION '2026-01-02' TO otel_traces_1m. Cela facilite la récupération si le rétroremplissage est interrompu ou échoue en raison de limites de ressources.Recommandations
Sélection et alignement de la granularité
- Graphiques temporels (graphiques linéaires ou en barres avec le temps sur l’axe des x) : La granularité explicite du graphique doit être un multiple de la granularité de la vue matérialisée. Par exemple, un graphique sur 10 minutes peut utiliser des vues matérialisées avec une granularité de 10, 5, 2 ou 1 minute, mais pas des vues de 20 minutes ou de 3 minutes.
-
Graphiques non temporels (graphiques de type nombre, table ou récapitulatif) :
La granularité effective est calculée comme
(time range / 80), puis arrondie à la granularité supérieure la plus proche prise en charge par HyperDX. Cette granularité calculée doit elle aussi être un multiple de la granularité de la vue matérialisée.
- Ne créez pas de vues matérialisées avec une granularité de 10 minutes. ClickStack prend en charge une granularité de 15 minutes pour les graphiques et les alertes, mais pas de 10 minutes. Une vue matérialisée de 10 minutes serait donc incompatible avec les visualisations et alertes courantes en 15 minutes.
- Préférez des granularités de 1 minute ou 1 heure, qui s’adaptent bien à la plupart des configurations de graphiques et d’alertes.
Limiter et consolider les vues matérialisées
- Pas plus de 20 vues matérialisées par source.
- Environ 10 vues matérialisées constituent généralement un optimum.
- Consolidez plusieurs visualisations dans une seule vue lorsqu’elles partagent des dimensions communes.
Choisissez soigneusement les dimensions
- Chaque colonne de regroupement supplémentaire augmente la taille de la vue.
- Trouvez le bon équilibre entre la flexibilité des requêtes et le coût du stockage et de l’insertion.
- Les filtres sur des colonnes absentes de la vue feront que ClickStack basculera vers la table source.
ConseilUne base de référence courante, et presque toujours utile, consiste à utiliser une vue matérialisée regroupée par nom du service et métrique de comptage, ce qui permet d’obtenir rapidement des histogrammes et des vues d’ensemble par service dans la recherche et les tableaux de bord.
Conventions de nommage des colonnes d’agrégation
- Format :
<aggFn>__<sourceColumn> - Exemples :
avg__Durationmax__Durationcount__pour le nombre de lignes
Quantiles et sélection du sketch
quantilesproduit des sketches plus volumineux sur disque, mais leur calcul au moment de l’insertion est moins coûteux.quantileTDigestest plus coûteuse à calculer au moment de l’insertion, mais produit des sketches plus petits, ce qui se traduit souvent par des requêtes sur les vues plus rapides.
quantile(0.5)) au moment de l’insertion pour les deux fonctions. Le sketch obtenu peut ensuite être interrogé pour d’autres valeurs de quantile, par exemple quantile(0.95). Nous vous recommandons d’expérimenter afin de trouver le meilleur équilibre pour votre workload.
Valider l’efficacité en continu
- Confirmez leur utilisation à l’aide des indicateurs d’accélération dans l’UI.
- Comparez les performances des requêtes avant et après l’activation de la vue.
- Surveillez l’utilisation des ressources et le comportement de fusion.
Configurations avancées
- Données récentes en haute résolution avec des vues historiques moins détaillées
- Vues au niveau du service pour une vue d’ensemble, et vues au niveau des endpoints pour un diagnostic approfondi
Limitations
Raisons courantes d’incompatibilité
- Intervalle de temps de la requête Le début de l’intervalle de temps de la requête est antérieur au timestamp minimal de la vue matérialisée. Comme les vues ne sont pas automatiquement alimentées avec des données historiques, elles ne peuvent répondre qu’aux requêtes portant sur des intervalles de temps qu’elles couvrent intégralement.
-
Incompatibilité de granularité
La granularité effective de la visualisation doit être un multiple exact de celle de la vue matérialisée. Plus précisément :
- Pour les graphiques temporels (graphiques en lignes ou en barres avec le temps sur l’axe des x), la granularité sélectionnée doit être un multiple de celle de la vue. Par exemple, un graphique sur 10 minutes peut utiliser des vues matérialisées de 10, 5, 2 ou 1 minute, mais pas des vues de 20 minutes ni de 3 minutes.
- Pour les graphiques non temporels (graphiques numériques ou tableaux), la granularité effective est calculée comme
(time range / 80), arrondie à la granularité la plus proche prise en charge par HyperDX, et doit elle aussi être un multiple de la granularité de la vue.
- Fonctions d’agrégation non prises en charge La requête demande une agrégation absente de la vue matérialisée. Seules les agrégations explicitement calculées et stockées dans la vue peuvent être utilisées.
-
Expressions de comptage personnalisées
Les requêtes qui utilisent des expressions comme
count(if(...))ou d’autres comptages conditionnels ne peuvent pas être dérivées à partir d’états d’agrégation standard et ne peuvent donc pas utiliser de vues matérialisées.
Contraintes de conception et d’exploitation
- Pas de rétroremplissage automatique Les vues matérialisées incrémentielles ne contiennent que les données insérées après leur création. L’accélération des données historiques nécessite un rétroremplissage explicite, qui peut être coûteux ou peu pratique pour de grands jeux de données.
- compromis de granularité Les vues avec une granularité très fine augmentent l’espace de stockage et le surcoût à l’insertion, tandis que les vues à granularité plus grossière réduisent la flexibilité. La granularité doit être choisie avec soin pour correspondre aux schémas de requête attendus.
- explosion des dimensions L’ajout de nombreuses dimensions de regroupement augmente considérablement la taille de la vue et peut en réduire l’efficacité. Les vues ne doivent inclure que les colonnes de regroupement et de filtrage couramment utilisées.
- évolutivité limitée du nombre de vues Chaque vue matérialisée ajoute un surcoût à l’insertion et accroît la pression sur les fusions. Créer trop de vues peut nuire à l’ingestion et aux fusions en arrière-plan.
Dépannage
La vue matérialisée n’est pas utilisée
- Ouvrez la fenêtre d’optimisation pour voir si le message « Plage de dates non prise en charge. » s’affiche.
- Assurez-vous que la plage de dates de la requête est postérieure à la date minimale de la vue matérialisée.
- Supprimez la date minimale si la vue matérialisée contient l’ensemble des données historiques.
- Vérifiez que la granularité du graphique est un multiple de celle de la MV.
- Essayez de régler le graphique sur « Auto » ou sélectionnez manuellement une granularité compatible.
- Vérifiez si le graphique utilise des agrégations présentes dans la MV.
- Consultez « Colonnes agrégées disponibles » dans la fenêtre d’optimisation.
- Assurez-vous que les colonnes de regroupement figurent parmi les colonnes de dimensions de la MV.
- Consultez « Colonnes de regroupement/filtre disponibles » dans la fenêtre d’optimisation.
Requêtes lentes sur les vues matérialisées
- La MV contient trop de lignes en raison d’une granularité trop fine (par ex., 1 seconde).
- Solution : créez une MV avec une granularité plus grossière (par ex., 1 minute ou 1 heure).
- La MV présente une cardinalité élevée en raison d’un trop grand nombre de colonnes de dimension.
- Solution : limitez les colonnes de dimension à celles qui sont le plus souvent utilisées.
- Le système exécute
EXPLAINsur chaque MV. - Solution : supprimez les MV rarement utilisées ou systématiquement ignorées.
Erreurs de configuration
- Ajoutez au moins une colonne agrégée à la configuration de la MV.
- Précisez quelle colonne agréger (
countest la seule agrégation pouvant omettre la colonne source).
- Utilisez l’une des granularités prédéfinies dans la liste déroulante.
- Le format doit être un intervalle SQL valide (par ex. :
1 hour, et non1 h).