Saltar al contenido principal
ClickHouse procesa las consultas con gran rapidez, pero la ejecución de una consulta no es tan sencilla. Intentemos entender cómo se ejecuta una consulta SELECT. Para ilustrarlo, agreguemos algunos datos a una tabla de ClickHouse:
Ahora que tenemos algunos datos en ClickHouse, queremos ejecutar algunas consultas y comprender cómo se ejecutan. La ejecución de una consulta se descompone en muchos pasos. Cada paso de la ejecución de la consulta puede analizarse y depurarse mediante la consulta EXPLAIN correspondiente. Estos pasos se resumen en el siguiente gráfico: Veamos cada elemento en acción durante la ejecución de la consulta. Vamos a tomar algunas consultas y luego examinarlas mediante la sentencia EXPLAIN.

Analizador sintáctico

El objetivo de un analizador sintáctico es transformar el texto de la consulta en un AST (árbol de sintaxis abstracta). Este paso se puede visualizar con EXPLAIN AST:
La salida es un árbol de sintaxis abstracta que puede visualizarse como se muestra a continuación: Cada nodo tiene sus nodos hijo correspondientes, y el árbol en su conjunto representa la estructura general de tu consulta. Se trata de una estructura lógica que ayuda a procesar una consulta. Desde el punto de vista del usuario final (salvo que le interese la ejecución de consultas), no resulta especialmente útil; esta herramienta está pensada principalmente para desarrolladores.

Analizador

Actualmente, ClickHouse tiene dos arquitecturas para el Analizador. Puede usar la arquitectura anterior configurando: enable_analyzer=0. La nueva arquitectura está habilitada de forma predeterminada. Aquí describiremos solo la nueva arquitectura, ya que la anterior quedará obsoleta cuando el nuevo analizador esté disponible de forma general.
La nueva arquitectura debería proporcionarnos un mejor marco para mejorar el rendimiento de ClickHouse. Sin embargo, dado que es un componente fundamental en las etapas del procesamiento de consultas, también podría tener un impacto negativo en algunas consultas y existen incompatibilidades conocidas. Puede volver al analizador anterior cambiando la configuración enable_analyzer a nivel de consulta o de usuario.
El analizador es una etapa importante de la ejecución de consultas. Toma un AST y lo transforma en un árbol de consulta. La principal ventaja de un árbol de consulta frente a un AST es que muchos componentes quedan resueltos, como el almacenamiento, por ejemplo. También sabemos de qué tabla leer, los alias se resuelven y el árbol conoce los distintos tipos de datos utilizados. Gracias a todo ello, el analizador puede aplicar optimizaciones. Estas optimizaciones funcionan mediante “pasadas”. Cada pasada busca optimizaciones diferentes. Puede ver todas las pasadas aquí; veámoslo en la práctica con nuestra consulta anterior:
Entre ambas ejecuciones, se puede ver la resolución de alias y proyecciones.

Planificador

El planificador toma un árbol de consulta y, a partir de él, construye un plan de consulta. El árbol de consulta nos indica qué queremos hacer con una consulta concreta, y el plan de consulta nos indica cómo lo haremos. También se realizan optimizaciones adicionales como parte del plan de consulta. Puede usar EXPLAIN PLAN o EXPLAIN para ver el plan de consulta (EXPLAIN ejecutará EXPLAIN PLAN).
Aunque esto nos da cierta información, podemos obtener más. Por ejemplo, quizá queramos conocer el nombre de la columna sobre la que necesitamos las proyecciones. Puedes añadir la cabecera a la consulta:
Así que ahora ya conoces los nombres de las columnas que deben crearse para la última Projection (minimum_date, maximum_date y percentage), pero quizá también quieras ver los detalles de todas las acciones que deben ejecutarse. Puedes hacerlo estableciendo actions=1.
Ahora puedes ver todas las entradas, funciones, alias y tipos de datos que se están usando. Puedes consultar aquí algunas de las optimizaciones que el planificador va a aplicar.

Pipeline de consulta

El pipeline de consulta se genera a partir del plan de consulta. El pipeline de consulta es muy similar al plan de consulta, con la diferencia de que no es un árbol sino un grafo. Ilustra cómo ClickHouse va a ejecutar una consulta y qué recursos se van a utilizar. Analizar el pipeline de consulta resulta muy útil para identificar dónde se encuentra el cuello de botella en términos de entradas/salidas. Tomemos nuestra consulta anterior y examinemos la ejecución del pipeline de consulta:
Dentro del paréntesis se encuentra el paso del plan de consulta y, junto a él, el procesador. Es información muy útil, pero dado que se trata de un grafo, sería conveniente visualizarlo como tal. Contamos con un parámetro graph que podemos establecer en 1 y especificar el formato de salida como TSV:
A continuación, puede copiar esta salida y pegarla aquí para generar el siguiente grafo: Un rectángulo blanco corresponde a un nodo del pipeline, el rectángulo gris corresponde a los pasos del plan de consulta, y la x seguida de un número corresponde a la cantidad de entradas/salidas que se están utilizando. Si no desea verlos en formato compacto, siempre puede añadir compact=0:
¿Por qué ClickHouse no lee de la tabla con varios hilos? Intentemos añadir más datos a nuestra tabla:
Ahora volvamos a ejecutar nuestra consulta EXPLAIN:
Así, el ejecutor decidió no paralelizar las operaciones porque el volumen de datos no era lo bastante alto. Al añadir más filas, el ejecutor pasó a usar varios hilos, como se muestra en el grafo.

Ejecutor

Por último, el ejecutor se encarga del último paso de la ejecución de la consulta. Toma el pipeline de consulta y lo ejecuta. Hay distintos tipos de ejecutores, según se trate de un SELECT, un INSERT o un INSERT SELECT.
Última modificación el 2 de julio de 2026