columns_cache_max_bytes_to_write_to_cache
Seuil souple, par requête, du nombre d’octets qu’une même requête écrit dans le cache de colonnes. Les octets écrits pendant la requête sont comptabilisés et, dès que le compteur atteint cette valeur, les écritures suivantes dans le cache sont ignorées jusqu’à la fin de la requête. Il s’agit d’un seuil indicatif et non d’une limite stricte : un lecteur accumule les entrées des granules qu’il a lus et les écrit dans le cache en un seul batch, et le batch qui franchit le seuil est stocké intégralement avant d’être décompté. La quantité réellement écrite peut donc dépasser cette valeur, au maximum, des entrées qu’un lecteur accumule entre deux écritures (les colonnes qu’il lit, à raison d’une entrée par segment (stripe) d’environ 65536 lignes) et, lorsque plusieurs lecteurs s’exécutent simultanément, de cette quantité pour chacun d’eux. L’objectif est d’éviter qu’un seul parcours volumineux n’évince des données utiles du cache, et non de borner précisément l’utilisation du cache. Une valeur de0 correspond à la moitié de la limite de taille actuelle du cache de colonnes : la valeur configurée de columns_cache_size, ou moins lorsque le cache est réduit en raison d’une pression mémoire (voir la métrique ColumnsCacheSizeLimit).
columns_cache_max_estimated_bytes_to_write_to_cache
Si la taille estimée des données qu’une requête lit depuis des partsMergeTree dépasse cette valeur, les écritures dans le cache de colonnes sont désactivées pour l’ensemble de la requête. L’estimation est exprimée en octets non compressés, c’est-à-dire l’unité dans laquelle le cache est décompté. Elle est calculée à partir de la taille des colonnes lues par la requête (y compris les colonnes de PREWHERE, de mutation et de parts de patch), rapportée aux plages de marques sélectionnées, et la totalité de ce montant est imputée à la requête avant même qu’elle ne lise quoi que ce soit. Cela évite qu’un seul parcours volumineux n’évince des données utiles du cache et n’y copie des données qui ne pourraient pas y rester.
Une valeur de 0 signifie que l’on utilise la moitié de la limite de taille actuelle du cache de colonnes. Cette limite correspond au columns_cache_size configuré tant que le serveur dispose de mémoire en suffisance, mais le cache se réduit en cas de pression mémoire (voir la métrique ColumnsCacheSizeLimit), et le budget par défaut se réduit avec lui. Avec la valeur par défaut de columns_cache_size_ratio, la moitié de la limite correspond à la taille du segment probatoire du cache : les données d’une requête qui franchit ce seuil peuvent donc être entièrement mises en cache en une seule passe.
Ce seuil ne s’applique pas à une lecture qui écarte des plages de marques en cours d’exécution, ce qui est le cas lorsque use_indexes_refiner_in_read_pools est activé : le nombre de marques sélectionnées réellement lues par une telle lecture n’est déterminé qu’au moment où chaque task est découpée, si bien que l’estimation ci-dessus ne serait qu’une borne supérieure comptabilisant des marques que la requête ne lit jamais. Pour ces lectures, c’est columns_cache_max_bytes_to_write_to_cache qui limite la quantité écrite.