# Continuous Query/ Task

En versiones 1.x, las *Continuous Queries* (CQs) eran la herramienta principal para automatizar el procesamiento periódico de datos. Sin embargo, en InfluxDB 2.x, las CQs han sido reemplazadas por *Tasks* basadas en el lenguaje Flux, lo que supone un cambio relevante en la administración y optimización de datos históricos.

## **¿Qué son las Continuous Queries?** <a href="#undefined" id="undefined"></a>

Las Continuous Queries (CQs) son consultas automáticas y periódicas que se ejecutan sobre los datos en tiempo real y almacenan los resultados en una medición específica.

Su objetivo principal es:

* Realizar downsampling (reducción de granularidad de datos).
* Precalcular agregaciones costosas.
* Optimizar el rendimiento de consultas frecuentes.

### **Sintaxis de Continuos Query en InfluxDB 1.x**

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

```sql
CREATE CONTINUOUS QUERY <NOMBRE_CQ> ON <BASE_DATOS_ORIGEN>
BEGIN
  SELECT mean(<NOMBRE_CAMPO>) 
  INTO <BASE_DATOS_ORIGEN>.<POLITICA_RETENCION_DESTINO>.<MEDICION_DESTINO>
  FROM <MEDICION_ORIGEN>
  GROUP BY time(<INTERVALO_TIEMPO>)
END
```

{% endcode %}

**Explicación:**

* `<BASE_DATOS_ORIGEN>`: Es la base de datos donde se define la CQ y desde donde se toman los datos de origen.
* `<POLITICA_RETENCION_DESTINO>`: Es la política de retención dentro de la misma base de datos donde se guardarán los resultados agregados.
* `<MEDICION_ORIGEN>`: Es la medición (tabla) de la que se toman los datos.
* `<MEDICION_DESTINO>`: Es la medición (tabla) donde se almacenan los resultados.
* **Importante:** Tanto la medición de origen como la de destino deben estar dentro de la misma base de datos, aunque pueden estar en diferentes políticas de retención.

### **Sintaxis de Tasks en Flux**

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

```
option task = {
  name: "<NOMBRE_TASK>",
  every: <INTERVALO_EJECUCION>,
  offset: <OFFSET_OPCIONAL>
}

from(bucket: "<BUCKET_ORIGEN>")
  |> range(start: -task.every)
  |> filter(fn: (r) => r._measurement == "<MEDICION_ORIGEN>")
  |> aggregateWindow(every: <INTERVALO_TIEMPO>, fn: mean)
  |> to(bucket: "<BUCKET_DESTINO>")
```

{% endcode %}

**Explicación:**

* **`option task`:** Define que este script Flux es una tarea programada.
* **`name`:** Es el nombre identificador de la tarea.
* **`every`:** Indica cada cuánto tiempo se ejecuta la tarea (por ejemplo, every: 1h para cada hora).
* **`offset`:** (opcional) Si lo incluyes, la tarea se ejecuta después de ese retraso (por ejemplo, offset: 10m para que empiece 10 minutos después de la hora programada).
* `<BUCKET_ORIGEN>`: Es el bucket desde donde se toman los datos de origen.
* `<MEDICION_ORIGEN>`: Es la medición (measurement) específica dentro del bucket de origen cuyos datos quieres procesar.
* `<INTERVALO_TIEMPO>`: Es el intervalo de tiempo para la agregación (por ejemplo, 5m para cinco minutos).
* `<BUCKET_DESTINO>`: Es el bucket donde se almacenarán los resultados agregados.

## **Continuous Queries vs. Tasks en InfluxDB 2.x** <a href="#undefined" id="undefined"></a>

| Característica | Continuous Queries (1.x) | Tasks (2.x)  |
| -------------- | ------------------------ | ------------ |
| Lenguaje       | InfluxQL                 | Flux         |
| Flexibilidad   | Limitada                 | Muy alta     |
| Gestión        | CLI                      | UI, CLI, API |
| Downsampling   | Sí                       | Sí           |
| Automatización | Sí                       | Sí           |

## **Buenas Prácticas y Recomendaciones** <a href="#undefined" id="undefined"></a>

* **Optimiza el rango de datos**: Usa rangos temporales ajustados en tus Tasks para evitar reprocesar datos innecesarios.
* **Divide los buckets**: Separa buckets para datos crudos y downsampleados, facilitando la gestión y consulta.
* **Monitorea el rendimiento**: Utiliza herramientas como Grafana y los logs internos de InfluxDB para detectar cuellos de botella y ajustar la frecuencia de ejecución.
* **Automatiza la limpieza**: Implementa Tasks para eliminar datos antiguos y evitar el crecimiento descontrolado de la base de datos.

## **Gestión y Mantenimiento** <a href="#undefined" id="undefined"></a>

* **Listar Tasks**: Desde la UI, CLI, API puedes listar, editar y eliminar Tasks fácilmente.
* **Modificar un Task**: Edita el código Flux y guarda los cambios; a diferencia de las CQs, no es necesario eliminar y recrear.


---

# 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-4/guion-de-la-sesion/documentacion/consultas-avanzadas-y-optimizacion/continuous-query-task.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.
