Le cache des conditions de requête fonctionne uniquement lorsque enable_analyzer est défini sur true, qui est la valeur par défaut.
WHERE col = 'xyz') sur les mêmes données renverra toujours les mêmes résultats.
Plus précisément, le cache des conditions de requête mémorise, pour chaque filtre évalué et chaque granule (= un bloc de 8192 lignes par défaut), si aucune ligne du granule ne satisfait la condition de filtrage.
Cette information est enregistrée sous la forme d’un seul bit : un bit à 0 indique qu’aucune ligne ne correspond au filtre, tandis qu’un bit à 1 signifie qu’au moins une ligne correspondante existe.
Dans le premier cas, ClickHouse peut ignorer le granule correspondant lors de l’évaluation du filtre ; dans le second, le granule doit être chargé et évalué.
Le cache des conditions de requête est efficace si trois prérequis sont remplis :
- Premièrement, la charge de travail doit évaluer de façon répétée les mêmes conditions de filtrage. Cela se produit naturellement lorsqu’une requête est répétée plusieurs fois, mais aussi lorsque deux requêtes partagent les mêmes filtres, par ex.
SELECT product FROM products WHERE quality > 3etSELECT vendor, count() FROM products WHERE quality > 3. - Deuxièmement, la majorité des données est immuable, c’est-à-dire qu’elle ne change pas entre les requêtes. C’est généralement le cas dans ClickHouse, car les parts sont immuables et créées uniquement par des INSERTs.
- Troisièmement, les filtres sont sélectifs, c’est-à-dire que relativement peu de lignes satisfont la condition de filtrage. Moins il y a de lignes qui correspondent à la condition de filtrage, plus de granules seront enregistrés avec un bit à 0 (aucune ligne correspondante), et plus de données pourront être écartées lors des évaluations suivantes du filtre.
Consommation de mémoire
query_condition_cache_size (par défaut : 100 MB).
Une taille de cache de 100 MB correspond à 100 * 1024 * 1024 * 8 = 838,860,800 entrées.
Comme chaque entrée représente un mark (8192 lignes par défaut), le cache peut couvrir jusqu’à 6,871,947,673,600 (6,8 billions) lignes d’une seule colonne.
En pratique, les filtres sont évalués sur plusieurs colonnes, ce nombre doit donc être divisé par le nombre de colonnes filtrées.
Paramètres de configuration et utilisation
use_query_condition_cache = true, utiliseront le cache des conditions de requête pour parcourir moins de données.
Administration
SYSTEM CLEAR QUERY CONDITION CACHE.
Le contenu du cache s’affiche dans la table système system.query_condition_cache.
Pour calculer la taille actuelle du cache des conditions de requête en MB, exécutez SELECT formatReadableSize(sum(entry_size)) FROM system.query_condition_cache.
Si vous souhaitez examiner des conditions de filtrage individuelles, vous pouvez consulter le champ condition dans system.query_condition_cache. Notez que ce champ n’est disponible que dans les versions de débogage.
Le nombre de succès et d’échecs du cache des conditions de requête depuis le démarrage de la base de données est affiché sous forme d’événements « QueryConditionCacheHits » et « QueryConditionCacheMisses » dans la table système system.events.
Ces deux compteurs ne sont mis à jour que pour les requêtes SELECT exécutées avec le paramètre use_query_condition_cache = true ; les autres requêtes n’affectent pas « QueryCacheMisses ».