> ## Documentation Index
> Fetch the complete documentation index at: https://help.treble.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Optimización de Consultas

> Cómo escribir consultas rápidas y eficientes contra el Analytics Warehouse.

# Optimización de Consultas

El Analytics Warehouse corre sobre ClickHouse, una base de datos columnar. Las consultas se comportan distinto que en una base de datos relacional tradicional — unos pocos hábitos las hacen dramáticamente más rápidas.

## Principios clave

### 1. Filtra siempre por fecha

Los datos están organizados físicamente por tiempo. Un filtro de fecha le permite a ClickHouse saltarse bloques enteros de historia sin leerlos — y como el warehouse ahora sirve **historia completa** (no solo 3 meses), los filtros de fecha importan más que nunca.

Cada tabla tiene una columna de tiempo principal por la cual filtrar:

| Tabla                                                                                                                                                                               | Filtra por     |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
| `fact_treble_sessions`, `fact_treble_session_messages`, `fact_treble_session_variables`, `fact_ad_sessions`                                                                         | `created_at`   |
| `fact_treble_session_nodes`                                                                                                                                                         | `entered_at`   |
| `fact_campaign_sends`                                                                                                                                                               | `scheduled_at` |
| `fact_campaign_daily`, `fact_agent_daily`                                                                                                                                           | `day`          |
| `fact_agent_conversations`, `fact_agent_conversation_messages`, `fact_agent_conversation_transfers`, `fact_agent_status_changes`, `fact_whatsapp_link_events`, `fact_target_events` | `created_at`   |
| `fact_hsm_responses`                                                                                                                                                                | `responded_at` |

```sql theme={null}
-- Bien: lee solo el segmento relevante de la historia
SELECT count() FROM fact_treble_sessions
WHERE created_at >= '2026-07-01' AND created_at < '2026-08-01'

-- Mal: escanea la historia completa de la tabla
SELECT count() FROM fact_treble_sessions
WHERE poll_name = 'Welcome flow'
```

### 2. No necesitas filtrar por company\_id

Tu usuario tiene una **row policy** que filtra por tu empresa automáticamente, y los datos están ordenados primero por empresa — todas las consultas se benefician de esto sin que agregues nada.

### 3. Selecciona solo las columnas que necesitas

ClickHouse lee únicamente las columnas que mencionas. Esto importa sobre todo en las columnas de texto anchas (`text`, `content`, `ai_automator_instructions`): dejarlas fuera de un `SELECT` puede reducir el costo de una consulta en un orden de magnitud.

```sql theme={null}
-- Bien: 3 columnas angostas
SELECT session_id, created_at, status
FROM fact_treble_sessions
WHERE created_at >= now() - INTERVAL 7 DAY

-- Evita: SELECT * arrastra todas las columnas anchas
SELECT * FROM fact_treble_session_messages
WHERE created_at >= now() - INTERVAL 7 DAY
```

### 4. Agrega en la base de datos, no en tu herramienta

Trae respuestas, no filas crudas. Un `GROUP BY` sobre millones de filas responde en bastante menos de un segundo; descargar esos millones de filas a una herramienta de BI, no.

### 5. Usa los agregados diarios cuando encajen

[`fact_campaign_daily`](/es/docs/data-warehouse-v2/fact-campaign-daily) y [`fact_agent_daily`](/es/docs/data-warehouse-v2/fact-agent-daily) precalculan las métricas de dashboard más comunes. Un dashboard sobre un agregado lee miles de filas en lugar de millones.

### 6. Usa LIMIT cuando explores

```sql theme={null}
SELECT * FROM fact_treble_session_messages
WHERE created_at >= now() - INTERVAL 1 DAY
ORDER BY created_at DESC
LIMIT 100
```

## Consejos para JOINs

* **Une por ids, no por nombres**: `session_id`, `agent_conversation_id`, `hsm_id` — los nombres son para mostrar.
* **Pon la tabla pequeña en el lado derecho** del JOIN — ClickHouse carga el lado derecho en memoria. Las dimensiones siempre son pequeñas; unir dos tablas de hechos grandes funciona mejor cuando ambos lados traen un filtro de fecha.
* **Incluye `company_id` en la clave del join** al unir hechos con dimensiones (como hacen los ejemplos de esta documentación).

```sql theme={null}
-- Sesiones enriquecidas con el nombre visible del canal
SELECT s.poll_name, c.display_name, count() AS sessions
FROM fact_treble_sessions AS s
LEFT JOIN dim_channels AS c
    ON c.company_id = s.company_id AND c.channel_id = s.channel_id
WHERE s.created_at >= today() - 30
GROUP BY s.poll_name, c.display_name
```

## Límites del sistema

Tu usuario corre con límites de protección que mantienen la plataforma estable para todos:

| Límite                                 | Valor       |
| -------------------------------------- | ----------- |
| Tiempo máximo de ejecución             | 30 segundos |
| Máximo de filas leídas                 | 50 millones |
| Máximo de bytes leídos                 | 5 GB        |
| Máximo de filas en el resultado        | 500,000     |
| Memoria máxima por consulta            | 2 GB        |
| Máximo de columnas leídas por consulta | 50          |

Si un límite cancela una consulta:

* Agrega o ajusta el filtro de fecha (la solución en casi todos los casos)
* Elimina columnas innecesarias — especialmente las columnas de texto anchas
* Agrega con `GROUP BY` en lugar de traer filas crudas
* Divide las extracciones muy grandes en bloques de un mes (mira [Sincronización Incremental](/es/docs/data-warehouse-v2/incremental-sync) para el patrón que evita las extracciones grandes por completo)
