columns_cache_max_bytes_to_write_to_cache
单个查询写入列缓存字节数的软阈值。系统会统计查询期间写入的字节数,一旦计数达到该值,该查询其余部分的缓存写入都将被跳过。这是一个建议性阈值,而非硬性上限:读取器会累积已读取粒度的条目,再以一个批次统一写入缓存,而越过阈值的那个批次会先被完整存储,之后才计入计数。因此,实际写入量最多可能比该值多出一个读取器在两次写入之间累积的条目量 (即其读取的各列,每个 stripe 一个条目,每个 stripe 约 65536 行) ;若有多个读取器同时运行,则每个读取器都可能超出这么多。该设置旨在防止单次大型扫描把有用数据挤出缓存,而非精确限制缓存用量。 值为0 表示使用列缓存当前大小上限的一半:即所配置的 columns_cache_size,若缓存因内存压力而缩小,则为更小的值 (参见 ColumnsCacheSizeLimit 指标) 。
columns_cache_max_estimated_bytes_to_write_to_cache
如果查询从MergeTree parts 中读取的数据估算大小超过此值,则整个查询都不会写入列缓存。估算以未压缩字节为单位 (缓存也按此单位计费) ,根据查询所读取列 (包括 PREWHERE 列、变更列和补丁 part 列) 的大小,按所选标记范围折算得出;查询在读取任何数据之前,就会按全部估算量计费。这样既能防止单次大型扫描把有用数据挤出缓存,也能避免将无法留存在缓存中的数据复制进去。
值为 0 表示使用列缓存当前大小限制的一半。服务器内存充裕时,该限制即为所配置的 columns_cache_size;但在内存压力下缓存会缩小 (参见 ColumnsCacheSizeLimit 指标) ,默认预算也会随之缩小。在默认的 columns_cache_size_ratio 下,该限制的一半恰好等于缓存试用段的大小,因此通过该门槛的查询,其数据可以一次性完整写入缓存。
该门槛不适用于在运行过程中会丢弃标记范围的读取,启用 use_indexes_refiner_in_read_pools 时即属此类情况:此类读取实际会访问多少所选标记,要到切分每个任务时才能确定,因此上述估算只是一个上界,会把查询根本不会读取的标记也计算在内。对于这类读取,写入量改由 columns_cache_max_bytes_to_write_to_cache 限制。