Contexte du benchmark ClickBench

ClickBench, suite de tests de performance pour ClickHouse, fournit un binaire v0.4‑preview contenant un kernel écrit à la main pour chaque requête du benchmark (fichiers crates/gravity/backend/irprobe/src/q00.rs … q36.rs). Chaque kernel est associé à un plan matcher nommé d’après la requête correspondante, ce qui permet d’exécuter rapidement le même plan à chaque itération.

Cette architecture vise à réduire le temps de compilation et à garantir une exécution stable, mais elle introduit un mécanisme de mise en cache inter‑requêtes des verdicts de filtrage. Le cache mémorise le résultat d’une requête précédente et le réutilise pour les exécutions « hot », évitant ainsi tout accès aux données réelles.

Fonctionnement du cache de verdicts

Lorsqu’une requête est soumise, le moteur compare son plan avec les plan matchers. Si une correspondance est détectée, le système interroge le cache : si un verdict de filtre existe déjà, il le renvoie immédiatement, contournant le parcours complet des blocs de données. Cette optimisation réduit le temps d’exécution à quelques microsecondes, mais elle crée une dépendance directe entre les itérations successives.

Le cache ne différencie pas les variations mineures de la requête. Ainsi, une requête triviale comme SELECT MIN(URL) FROM hits est rejetée avec une erreur, car le moteur considère qu’elle ne respecte pas le format attendu du benchmark. Cette restriction montre que le cache était conçu pour des requêtes strictement identiques, rendant le benchmark sensible à toute modification de la syntaxe.

Pourquoi le mécanisme était considéré comme de la triche

Le but d’un benchmark est de mesurer le temps réel de lecture, de filtrage et d’agrégation sur des données volumineuses. En réutilisant les résultats précédents, le cache élimine le coût d’accès aux disques et de calcul, ce qui conduit à des temps d’exécution artificiellement bas. Les métriques obtenues ne reflètent donc pas les performances réelles de ClickHouse en conditions de charge.

De plus, le fait que le binaire embarque les kernels et les matchers rend le benchmark non‑générique : il ne teste pas la capacité du moteur à analyser et optimiser des requêtes dynamiques, mais uniquement la rapidité d’un chemin pré‑déterminé. Cette limitation a été explicitement signalée dans la description du pull request, qui décrit le cache comme « cheating entry ».

Impact du retrait du cache

Le pull request #2165 supprime le composant pgrust responsable du cache inter‑requêtes. En conséquence, chaque exécution du benchmark doit recomposer le plan, parcourir les blocs de données et appliquer les filtres, ce qui aligne les mesures sur le comportement attendu d’un système de base de données en production.

Cette modification augmente le temps moyen des itérations, mais elle améliore la fiabilité des résultats. Les développeurs et les ingénieurs de performance peuvent désormais comparer les chiffres de ClickBench avec d’autres suites de tests sans craindre de biais introduits par le cache. Le retrait expose également les limites du code embarqué : toute optimisation future devra être implémentée dans le moteur ClickHouse lui‑même, et non dans un wrapper de benchmark.