# (InfluxQL) Diagnóstico con EXPLAIN ANALYZE

Una de las herramientas más potentes para analizar y optimizar consultas en InfluxDB es el comando `EXPLAIN ANALYZE`, que permite inspeccionar cómo se ejecuta internamente una consulta y detectar posibles cuellos de botella o ineficiencias.

### ¿Qué es EXPLAIN ANALYZE? <a href="#qu-es-explain-analyze" id="qu-es-explain-analyze"></a>

**EXPLAIN ANALYZE** es un comando que permite visualizar el plan de ejecución de una consulta en InfluxDB, mostrando tanto el plan lógico como el plan físico, e incluyendo métricas de ejecución como número de filas procesadas y tiempos de ejecución. Esto es esencial para comprender cómo el motor de InfluxDB procesa las consultas y para identificar oportunidades de optimización.

### Modos de uso

* `EXPLAIN`: Muestra los planes lógico y físico de la consulta.
* `EXPLAIN ANALYZE`: Ejecuta la consulta y anota el plan físico con métricas de ejecución.
* `EXPLAIN ANALYZE VERBOSE`: Añade detalles adicionales útiles para depuración, como rutas de archivos Parquet leídos y todos los planes físicos intermedios generados durante la optimización.

***

### Estructura de los Planes de Ejecución <a href="#estructura-de-los-planes-de-ejecucin" id="estructura-de-los-planes-de-ejecucin"></a>

**Plan Lógico:** El plan lógico representa la secuencia de operaciones abstractas que el motor debe realizar para responder a la consulta (filtrado, agrupamiento, agregación).

**Plan Físico:** El plan físico detalla los pasos concretos que ejecutará el motor, incluyendo cómo se accede a los datos, qué índices se utilizan y cómo se distribuyen las operaciones entre los nodos.

### Métricas de Ejecución

Cuando se usa `ANALYZE`, el plan físico se complementa con información como:

* Contadores de ejecución
* Número de filas producidas en cada etapa
* Tiempos de ejecución por operación

***

### Ejemplo Práctico <a href="#ejemplo-prctico" id="ejemplo-prctico"></a>

{% code title="sql" overflow="wrap" %}

```sql
EXPLAIN ANALYZE SELECT mean(temperatura) AS temp FROM ambiente WHERE time >= '2025-06-10T00:00:00Z' AND time <= '2025-06-12T23:59:59Z' GROUP BY ubicacion
```

{% endcode %}

Este comando mostrará el plan lógico y físico de la consulta, junto con métricas de ejecución como el número de archivos leídos, filas procesadas y tiempos por cada operación.

#### Resultado

EXPLAIN

```
name,tags,QUERY PLAN
,,EXPRESSION: mean(temperatura::float) -- Se calcula el promedio del campo temperatura
,,NUMBER OF SHARDS: 1 -- La consulta accede a 1 shard (fragmento de datos)
,,NUMBER OF SERIES: 22 -- Hay 22 series únicas
,,CACHED VALUES: 0 -- No hay valores en caché utilizados para esta consulta
,,NUMBER OF FILES: 19 -- Se han leído 19 archivos de almacenamiento de datos
,,NUMBER OF BLOCKS: 38 -- Se han procesado 38 bloques de datos
,,SIZE OF BLOCKS: 259538 -- El tamaño total de los bloques leídos es 259538 bytes (aproximadamente 259 KB)
```

EXPLAIN ANALYZE

* **Plan lógico:** Describe la estructura conceptual de la consulta (select -> create\_iterator)
* **Plan físico**: Detalla como se van a ejecutar las operaciones lógicas (label -> blocks, cursors)
* **Métricas de ejecución**: Indican cuanto demoró cada etapa (execution\_time, planning\_time, total\_time)

```
name,tags,EXPLAIN ANALYZE
,,.
,,└── select
,,"    ├── execution_time: 417.104µs" -- Tiempo que tardó en ejecutarse la consulta
,,"    ├── planning_time: 1.33315ms" -- Tiempo dedicado a planificar la consulta
,,"    ├── total_time: 1.750254ms" -- Tiempo total desde el inicio de la planificación hasta el fin de la ejecución
,,"    └── create_iterator" -- Nodo encargado de crear los iteradores para recorrer los datos
,,"        ├── labels" -- Etiquetas asociadas a este nodo
,,"        │   ├── measurement: ambiente" -- El measurement consultado es 'ambiente'
,,"        │   └── shard_id: 38" -- El ID del shard (fragmento de datos) utilizado
,,"        ├── cursors_ref: 22" -- Cursores de referencia: número de series principales leídas
,,"        ├── cursors_aux: 0" -- Cursores auxiliares: usados para operaciones adicionales como joins, subconsultas o cálculos intermedios
,,"        ├── cursors_cond: 0" -- Cursores condicionales: empleados cuando hay condiciones especiales o filtros complejos
,,"        ├── float_blocks_decoded: 60" -- Bloques de tipo float decodificados
,,"        ├── float_blocks_size_bytes: 410585" -- Tamaño total en bytes de los bloques float leídos
,,"        ├── integer_blocks_decoded: 0" -- Bloques de enteros decodificados
,,"        ├── integer_blocks_size_bytes: 0" -- Tamaño de bloques de enteros
,,"        ├── unsigned_blocks_decoded: 0" -- Bloques de enteros sin signo decodificados
,,"        ├── unsigned_blocks_size_bytes: 0" -- Tamaño de bloques unsigned
,,"        ├── string_blocks_decoded: 0" -- Bloques de cadenas decodificados
,,"        ├── string_blocks_size_bytes: 0" -- Tamaño de bloques de cadenas
,,"        ├── boolean_blocks_decoded: 0" -- Bloques booleanos decodificados
,,"        ├── boolean_blocks_size_bytes: 0" -- Tamaño de bloques booleanos
,,"        └── planning_time: 1.066827ms" -- Tiempo de planificación específico para este nodo
```

Esto permite identificar, por ejemplo:

* Si la consulta está leyendo demasiados archivos o datos innecesarios.
* Si algún paso consume mucho tiempo.
* Si se están usando correctamente los filtros para reducir la cantidad de datos leídos.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://darioaplicano.gitbook.io/influxdb2.x/sesion-5/guion-de-la-sesion/documentacion/diagnostico-de-problemas-en-influxdb/identificacion-de-cuellos-de-botella-en-consultas/influxql-diagnostico-con-explain-analyze.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
