columns_cache_max_bytes_to_write_to_cache
1つのクエリがカラムキャッシュに書き込むバイト数に対する、クエリ単位のソフトしきい値です。クエリ実行中に書き込まれたバイト数がカウントされ、カウンターがこの値に達すると、そのクエリの以降の処理ではキャッシュへの書き込みがスキップされます。これはあくまで目安となるしきい値であり、厳密な上限ではありません。リーダーは読み込んだグラニュールのエントリを蓄積し、1回のバッチでまとめてキャッシュに書き込みます。しきい値をまたぐバッチも、カウンターに加算される前に全体が格納されます。そのため実際の書き込み量は、1つのリーダーが2回の書き込みの間に蓄積するエントリ分 (読み込むカラムごとに、約65536行のストライプ1つにつき1エントリ) だけこの値を超える場合があり、複数のリーダーが同時に実行されている場合は、リーダーごとにその分だけ超過する可能性があります。この設定の目的は、単一の大規模なスキャンによって有用なデータがキャッシュから追い出されるのを防ぐことであり、キャッシュ使用量を厳密に制限することではありません。 値が0 の場合は、カラムキャッシュの現在のサイズ上限の半分が使用されます。この上限は通常、設定された columns_cache_size ですが、メモリ逼迫によりキャッシュが縮小されている間はそれより小さくなります (ColumnsCacheSizeLimit メトリクスを参照してください) 。
columns_cache_max_estimated_bytes_to_write_to_cache
クエリがMergeTree パーツから読み取るデータの推定サイズがこの値を超える場合、そのクエリ全体でカラムキャッシュへの書き込みが抑止されます。推定値は、キャッシュの使用量として計上される単位である非圧縮バイト数で算出されます。具体的には、クエリが読み取るカラム (PREWHERE、ミューテーション、パッチパーツのカラムを含む) のサイズを選択されたマーク範囲に応じてスケーリングした値であり、クエリが読み取りを開始する前にその全量が計上されます。これにより、単一の大規模なスキャンによってキャッシュ内の有用なデータが追い出されたり、キャッシュに保持しきれないデータがキャッシュへコピーされたりすることを防ぎます。
値が 0 の場合は、カラムキャッシュの現在のサイズ上限の半分を使用します。サーバーのメモリに余裕がある間は、設定された columns_cache_size がその上限となります。ただし、メモリ逼迫時にはキャッシュが縮小し (ColumnsCacheSizeLimit メトリクスを参照)、それに伴ってデフォルトの上限値も縮小します。デフォルトの columns_cache_size_ratio では、上限の半分がキャッシュの試用 (probationary) セグメントのサイズに相当するため、この判定を通過したクエリのデータは 1 回のパスで完全にキャッシュできます。
この判定は、実行中にマーク範囲を除外する読み取りには適用されません。use_indexes_refiner_in_read_pools が有効な場合がこれに該当します。このような読み取りでは、選択されたマークのうち実際にどれだけを参照するかが各タスクの切り出し時点で初めて決まります。そのため、上記の推定値は、クエリが実際には読み取らないマークまで計上した上限値になってしまいます。こうした読み取りでは、代わりに columns_cache_max_bytes_to_write_to_cache によって書き込み量が制限されます。