Avant de commencer
nyc_taxi.trips_small_inferred si ce n’est pas déjà fait :
Configurer l'ensemble de données d'exemple
Configurer l'ensemble de données d'exemple
Le fichier Parquet source fait environ 5,8 Go. Son chargement peut prendre plusieurs minutes, selon votre réseau et les ressources disponibles.
ORDER BY () ; son filtre de date ne peut donc pas s’appuyer sur une clé de tri pour éliminer des données lors de la lecture. Utilisez cet exemple pour vous exercer à la méthode de comparaison, et non comme référence de performance.
Fonctionnement
- Exécutez la requête d’origine afin d’établir les mesures de référence.
- Conservez
GROUP BY, remplacez les calculs d’agrégation de la requête parcount, puis supprimez les opérations ultérieures, telles que le tri et le formatage de sortie. - Supprimez le regroupement et exécutez un
countsans regroupement afin d’estimer le traitement restant lié au parcours, au filtrage et aux éventuelles jointures.
SELECT à la fois : conservez des sources de données et des filtres équivalents, supprimez une opération à la fois et vérifiez le plan d’exécution après chaque modification.
Ces différences constituent des estimations à des fins de diagnostic, et non des mesures exactes des étapes d’exécution de ClickHouse. La modification de la requête peut altérer son plan d’exécution, les colonnes lues et les données transmises entre les étapes. Utilisez les résultats pour formuler une hypothèse, puis validez-la à l’aide des journaux de requêtes et de
EXPLAIN.Établissez une référence reproductible
- Conservez les clauses
FROM,JOIN,PREWHEREetWHEREinchangées afin que chaque comparaison porte sur les mêmes données et le même intervalle de temps. - Exécutez chaque version de la requête plusieurs fois dans des conditions de charge système similaires.
- Maintenez des conditions de cache cohérentes. Exécutez chaque version de la requête avant d’enregistrer les mesures ou désactivez les caches répertoriés ci-dessous. Ne comparez pas des exécutions avec et sans cache.
- Enregistrez une durée représentative, par exemple la médiane des exécutions répétées après les éventuelles exécutions de préchauffage, plutôt que de vous fier au résultat le plus rapide ou le plus lent.
- Modifiez une variable à la fois afin de pouvoir attribuer une différence de performances à une modification précise.
count de l’exécution C n’utilise pas un plan d’exécution optimisé qui évite le parcours que vous souhaitez comparer.
Ces instructions
SET s’appliquent uniquement à la session en cours. Exécutez toutes les requêtes de comparaison dans cette session ou appliquez les mêmes paramètres à chaque exécution. Le paramètre du cache du système de fichiers ne désactive ni le cache de pages du système d’exploitation ni l’ensemble des caches ClickHouse. Lorsque vous avez terminé, fermez la session dédiée ou restaurez chaque paramètre à sa valeur précédente.-
Affectez un ID de requête unique à chaque exécution ou enregistrez l’ID généré par votre interface de requêtes. Par exemple, identifiez les exécutions répétées par
bottleneck-a-1,bottleneck-a-2etbottleneck-a-3. Avecclickhouse-client, transmettez--query_id your-query-idlors de l’exécution d’une requête. - Exécutez chaque requête de comparaison plusieurs fois dans les mêmes conditions. Distinguez les exécutions de préchauffage des exécutions mesurées.
-
Videz le journal des requêtes avant de rechercher les requêtes récemment terminées :
Si vous ne pouvez pas exécuter
SYSTEM FLUSH LOGS, attendez que le journal des requêtes soit vidé automatiquement, puis relancez la recherche. Si l’enregistrement n’apparaît jamais, vérifiez que la journalisation des requêtes est activée, que vous pouvez liresystem.query_loget que vous interrogez le nœud ayant exécuté la requête. -
Recherchez l’enregistrement terminé pour chaque ID de requête.
system.query_logenregistre les événementsQueryStartetQueryFinishd’une requête terminée. Filtrez surQueryFinish, qui contient la durée finale, le nombre de lignes et d’octets lus, ainsi que le pic de mémoire : -
Pour chaque version de la requête, utilisez la durée médiane des exécutions mesurées. Relevez
read_rows,read_byteset le pic de mémoire de l’exécution la plus proche de cette médiane afin que les mesures correspondent à une exécution réelle.
Pour les requêtes distribuées,
memory_usage dans l’enregistrement QueryFinish de la requête initiatrice ne représente pas le pic à l’échelle du cluster. Utilisez initial_query_id pour examiner les enregistrements QueryFinish enfants sur les nœuds participants.system.query_log pour plus d’informations sur ses champs et sa configuration.
- Tableau
- CSV
Exécuter des requêtes de plus en plus simples
GROUP BY, ignorez l’exécution B comme décrit ci-dessous.
1
Exécution A : mesurer la requête d'origine
Exécutez la requête complète sans modifier ses filtres, son regroupement, ses expressions d’agrégation, son tri ni sa sortie. Cela établit une référence pour la durée, le nombre de lignes et d’octets lus, ainsi que le pic d’utilisation de la mémoire.Cette requête regroupe les trajets par type de paiement et calcule plusieurs valeurs agrégées :Enregistrez les mesures de la requête sous l’exécution A.
2
Exécution B : conserver le regroupement avec count
Conservez les clauses L’exécution B continue de parcourir et de filtrer les données, d’effectuer les jointures éventuelles et de constituer les groupes. Comparez sa durée à celle de l’exécution A pour estimer la contribution des expressions d’agrégation d’origine et des opérations effectuées après l’agrégation. Comparez également
FROM, JOIN, PREWHERE et WHERE, ainsi que les clés de regroupement de la requête. Remplacez ses expressions d’agrégation par un count regroupé. Supprimez les opérations effectuées après l’agrégation, notamment le tri d’origine et les expressions de sortie.read_bytes, car la suppression d’expressions d’agrégation peut réduire le nombre de colonnes lues.Si la requête d’origine ne contient pas de GROUP BY, il n’y a pas d’étape de regroupement à isoler. Ignorez l’exécution B et comparez directement la requête d’origine à l’exécution C.3
Exécution C : supprimer le regroupement
Supprimez L’exécution C fournit une référence pour les opérations conservées par son plan, et non une mesure isolée du parcours ou du filtrage. Comparez-la à l’exécution B pour estimer la contribution du regroupement. Comparez également
GROUP BY et renvoyez un unique count. Conservez les clauses FROM, JOIN, PREWHERE et WHERE inchangées afin que les opérations restantes soient comparables.read_bytes, car la suppression de la clé de regroupement peut réduire le nombre de colonnes lues. Le count renvoyé indique le nombre de lignes qui atteignent l’agrégation après application des filtres et jointures conservés.Avant d’interpréter l’exécution C, vérifiez que son plan d’exécution lit la source de données prévue et applique les filtres conservés. Une projection ou un comptage basé sur les métadonnées peut modifier les opérations effectuées. Pour obtenir une référence basée sur le parcours, désactivez, pour les trois exécutions, l’optimisation indiquée dans le plan : utilisez optimize_use_implicit_projections = 0 pour une projection implicite, optimize_use_projections = 0 pour une projection explicite ou optimize_trivial_count_query = 0 pour un comptage non filtré fourni à partir des métadonnées de la table.Si l’exécution C reste lente, examinez les opérations qu’elle conserve, en commençant par le parcours et le filtrage. Utilisez les journaux de requêtes et EXPLAIN pour valider le goulot d’étranglement suspecté avant de modifier la requête.Interpréter les différences
Comparer les lignes lues au résultat de count
read_rows pour l’exécution C à la valeur renvoyée par son count. Par exemple, si read_rows est de 100 millions et que count renvoie 1 million, ClickHouse a parcouru environ 100 lignes sources pour chaque ligne comptée. Cela montre que le filtre a écarté la plupart des lignes lues dans la table, mais n’indique pas pourquoi. Ce ratio est destiné aux parcours simples sur une seule table. Pour les requêtes comportant plusieurs sources de données ou projections, interprétez plutôt read_rows à l’aide du plan d’exécution.
Pour ClickHouse 25.9 et versions ultérieures, désactivez le cache des conditions de requête et l’application dynamique des index de saut de données avant d’examiner l’utilisation des index :
EXPLAIN indexes = 1 pour voir quels index ClickHouse a utilisés et combien de parties et de granules chaque index a éliminés. Si ClickHouse a sélectionné plus de granules que prévu, vérifiez si les filtres sont alignés sur la clé de tri de la table et si l’élagage des partitions ou un index de saut de données pourrait éliminer davantage de granules. Si le plan ne comporte pas de section Indexes, EXPLAIN n’a pas signalé d’élagage d’index pour cette requête. À l’inverse, une requête analytique portant sur l’ensemble de la table lira vraisemblablement la majeure partie de celle-ci.
Valider le goulot d’étranglement suspecté
- Pour un goulot d’étranglement lié au parcours ou au filtrage, utilisez
EXPLAIN indexes = 1avec les paramètres décrits ci-dessus afin de voir quels index ClickHouse utilise et combien de parts et de granules chaque index élimine. Vérifiez si le plan utilise une projection implicite au lieu du parcours attendu. - Pour un goulot d’étranglement lié au regroupement ou à l’agrégation, examinez les événements de profil de requête pertinents et le pic d’utilisation de la mémoire.
- Si l’exécution C reste lente et contient des jointures, comparez-la à une requête de diagnostic qui supprime une jointure à la fois. Une forte diminution de la durée indique que la jointure supprimée représente une charge de travail importante. Comme la suppression d’une jointure modifie le sens de la requête, utilisez cette comparaison uniquement pour isoler les temps d’exécution et interprétez séparément les variations du nombre de lignes.
- Pour un goulot d’étranglement dans une autre opération conservée par l’exécution C, examinez le plan d’exécution et les événements de profil de requête pertinents.
EXPLAIN. Appliquez une modification ciblée, puis répétez les exécutions A, B et C dans les mêmes conditions. Vérifiez que la modification a réduit le travail visé et n’a pas déplacé le goulot d’étranglement ailleurs.