Saltar al contenido principal
La caché de condiciones de consulta solo funciona cuando enable_analyzer está establecido en true, que es el valor predeterminado.
Muchas cargas de trabajo reales implican consultas repetidas sobre los mismos datos o casi los mismos (por ejemplo, datos ya existentes más datos nuevos). ClickHouse proporciona varias técnicas de optimización para este tipo de patrones de consulta. Una posibilidad es ajustar la organización física de los datos mediante estructuras de índice (p. ej., índices de clave primaria, índices de omisión, proyecciones) o precálculo (vistas materializadas). Otra posibilidad es usar la caché de consultas de ClickHouse para evitar evaluar repetidamente las consultas. La desventaja del primer enfoque es que requiere intervención manual y supervisión por parte de un administrador de bases de datos. El segundo enfoque puede devolver resultados desactualizados (ya que la caché de consultas no es consistente a nivel transaccional), lo cual puede o no ser aceptable según el caso de uso. La caché de condiciones de consulta ofrece una solución elegante para ambos problemas. Se basa en la idea de que evaluar una condición de filtro (p. ej., WHERE col = 'xyz') sobre los mismos datos siempre devolverá los mismos resultados. Más concretamente, la caché de condiciones de consulta recuerda, para cada filtro evaluado y cada gránulo (= un bloque de 8192 filas de forma predeterminada), si ninguna fila del gránulo satisface la condición de filtro. La información se registra como un único bit: un bit 0 representa que ninguna fila coincide con el filtro, mientras que un bit 1 significa que existe al menos una fila coincidente. En el primer caso, ClickHouse puede omitir el gránulo correspondiente durante la evaluación del filtro; en el segundo, el gránulo debe cargarse y evaluarse. La caché de condiciones de consulta es eficaz si se cumplen tres requisitos previos:
  • En primer lugar, la carga de trabajo debe evaluar repetidamente las mismas condiciones de filtro. Esto ocurre de forma natural si una consulta se repite varias veces, pero también puede suceder si dos consultas comparten los mismos filtros, p. ej. SELECT product FROM products WHERE quality > 3 y SELECT vendor, count() FROM products WHERE quality > 3.
  • En segundo lugar, la mayor parte de los datos es inmutable, es decir, no cambia entre consultas. En general, este es el caso en ClickHouse, ya que las partes son inmutables y solo se crean mediante INSERTs.
  • En tercer lugar, los filtros son selectivos, es decir, solo relativamente pocas filas satisfacen la condición de filtro. Cuantas menos filas coincidan con la condición de filtro, más gránulos se registrarán con el bit 0 (sin filas coincidentes) y más datos podrán descartarse en evaluaciones posteriores del filtro.

Consumo de memoria

Dado que la caché de condiciones de consulta almacena solo un bit por condición de filtro y gránulo, consume muy poca memoria. El tamaño máximo de la caché de condiciones de consulta se puede configurar mediante el ajuste del servidor query_condition_cache_size (valor predeterminado: 100 MB). Un tamaño de caché de 100 MB corresponde a 100 * 1024 * 1024 * 8 = 838,860,800 entradas. Dado que cada entrada representa una marca (8192 filas de forma predeterminada), la caché puede abarcar hasta 6,871,947,673,600 (6,8 billones) de filas de una sola columna. En la práctica, los filtros suelen evaluarse sobre más de una columna, por lo que ese número debe dividirse por la cantidad de columnas filtradas.

Configuración y uso

La configuración use_query_condition_cache controla si una consulta concreta o todas las consultas de la sesión actual deben utilizar la caché de condiciones de consulta. Por ejemplo, la primera ejecución de la consulta
SELECT col1, col2
FROM table
WHERE col1 = 'x'
SETTINGS use_query_condition_cache = true;
almacenará los rangos de la tabla que no cumplan el predicado. Las ejecuciones posteriores de la misma consulta, también con el parámetro use_query_condition_cache = true, utilizarán la caché de condiciones de consulta para escanear menos datos.

Administración

La caché de condiciones de consulta no se conserva entre reinicios de ClickHouse. Para vaciar la caché de condiciones de consulta, ejecute SYSTEM CLEAR QUERY CONDITION CACHE. El contenido de la caché se muestra en la tabla del sistema system.query_condition_cache. Para calcular el tamaño actual de la caché de condiciones de consulta en MB, ejecute SELECT formatReadableSize(sum(entry_size)) FROM system.query_condition_cache. Si desea examinar condiciones de filtro individuales, puede consultar el campo condition en system.query_condition_cache. Tenga en cuenta que este campo solo está disponible en compilaciones de depuración. El número de aciertos y fallos de la caché de condiciones de consulta desde el inicio de la base de datos se muestra como los eventos “QueryConditionCacheHits” y “QueryConditionCacheMisses” en la tabla del sistema system.events. Ambos contadores solo se actualizan para consultas SELECT que se ejecutan con la configuración use_query_condition_cache = true; otras consultas no afectan a “QueryCacheMisses”.
Última modificación el 10 de junio de 2026