> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-home-button.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Crea tu primera proyección

> Aprende a usar las proyecciones en ClickHouse para almacenar una copia ordenada adicional de tus datos en la misma tabla, lo que permite búsquedas rápidas en columnas no incluidas en tu clave primaria.

<a href="/es/get-started/quickstarts/home"><Badge size="lg" color="gray" icon="arrow-left">Todas las guías de inicio rápido</Badge></a>

<div className="mt-2 flex flex-wrap gap-2">
  <Badge size="lg" color="blue">Analítica en tiempo real</Badge>
  <Badge size="lg" color="blue">Data warehousing</Badge>
  <Badge size="lg" color="blue">Observabilidad</Badge>
  <Badge size="lg" color="blue">IA/ML</Badge>
  <Badge size="lg" color="orange">Cloud</Badge>
  <Badge size="lg" color="orange">Oss</Badge>
</div>

<div id="prerequisites">
  ## Requisitos previos
</div>

To successfully follow this guide, you'll need the following:

* A running ClickHouse Cloud service. If you don't have one yet, complete the [Create your first Cloud service](/get-started/quickstarts/create-your-first-service-on-cloud) quickstart first.

También deberías haber completado las siguientes guías de inicio rápido, ya que esta guía se basa directamente en la tabla `uk_price_paid` y en los conceptos que se introducen allí:

* [Crea tu primera tabla MergeTree](/es/get-started/quickstarts/create-your-first-mergetree-table)
* [Crea tu primera vista materializada](/es/get-started/quickstarts/create-your-first-materialized-view)

<div id="what-youll-build">
  ## Lo que crearás
</div>

En la guía de inicio rápido de MergeTree viste que consultar `uk_price_paid` por `town` o `county` requiere un escaneo completo de la tabla porque está ordenada por `(postcode, addr1, addr2)`.
En esta guía de inicio rápido resolverás ese problema creando una **proyección**: una representación ordenada adicional de tus datos almacenada *dentro* de la misma tabla. A diferencia de las vistas materializadas, las proyecciones no requieren una tabla de destino independiente, se mantienen sincronizadas con las mutaciones (eliminaciones y actualizaciones) y el optimizador de consultas las usa de forma transparente; sigues consultando la misma tabla.
Al final, entenderás cómo añadir y materializar una proyección, cómo ClickHouse la selecciona automáticamente y cuándo elegir proyecciones en lugar de vistas materializadas.

<Steps titleSize="h3">
  <Step>
    ### Entiende por qué necesitas una proyección

    Tu tabla `uk_price_paid` está ordenada por `(postcode, addr1, addr2)`. Esto significa que ClickHouse puede omitir grandes bloques de datos cuando filtras por `postcode`, `addr1` o `addr2`, pero las consultas que filtran por `town` deben escanear cada una de las filas: los 30 millones.

    Una **proyección** almacena una copia adicional ordenada de (algunas o todas las) columnas *dentro de la misma tabla*. Cuando consultas la tabla, el optimizador de consultas comprueba automáticamente si leer desde la proyección implicaría menos gránulos que los datos base y, si es así, la utiliza de forma transparente.

    Diferencias clave con las vistas materializadas:

    * **Sin tabla independiente**: la proyección reside dentro de `uk_price_paid`
    * **Optimización transparente de consultas**: consultas `uk_price_paid` con normalidad; ClickHouse elige la proyección automáticamente
    * **Se mantiene sincronizada con las mutaciones**: las eliminaciones y actualizaciones aplicadas a la tabla se reflejan en la proyección

    Más información en la [documentación de referencia sobre proyecciones](/es/reference/statements/alter/projection).
  </Step>

  <Step>
    ### Agrega una proyección a tu tabla

    Define una proyección sobre `uk_price_paid` que almacene `town`, `date`, `price` y `type`, ordenados por `(town, date)`:

    ```sql theme={null}
    ALTER TABLE uk_price_paid
        ADD PROJECTION uk_price_paid_by_town
        (
            SELECT town, date, price, type
            ORDER BY (town, date)
        );
    ```

    Esto registra la proyección en los metadatos de la tabla, pero **no** la materializa para los datos existentes; solo las inserciones futuras la poblarán.

    Comprueba que la proyección aparezca en la definición de la tabla:

    ```sql theme={null}
    SHOW CREATE TABLE uk_price_paid;
    ```

    Deberías ver el bloque `PROJECTION uk_price_paid_by_town` en la salida.
  </Step>

  <Step>
    ### Materializar la proyección para los datos existentes

    Al igual que las vistas materializadas, una proyección recién añadida solo se aplica a las inserciones futuras. Para rellenarla con los 30 millones de filas que ya están en la tabla, materialícela explícitamente:

    ```sql theme={null}
    ALTER TABLE uk_price_paid
        MATERIALIZE PROJECTION uk_price_paid_by_town;
    ```

    Esto se ejecuta como una mutación en segundo plano. Puede consultar su progreso:

    ```sql theme={null}
    SELECT
        mutation_id,
        command,
        is_done
    FROM system.mutations
    WHERE table = 'uk_price_paid'
    ORDER BY create_time DESC
    LIMIT 5;
    ```

    Una vez que `is_done = 1`, la proyección está completamente materializada. También puede comprobarlo consultando `system.projection_parts`:

    ```sql theme={null}
    SELECT
        name,
        count() AS parts,
        sum(rows) AS total_rows,
        formatReadableSize(sum(bytes_on_disk)) AS size
    FROM system.projection_parts
    WHERE table = 'uk_price_paid'
      AND active = true
    GROUP BY name;
    ```
  </Step>

  <Step>
    ### Consulta la tabla y observa el uso automático de la proyección

    Ahora ejecuta una consulta con filtro por `town`, en la **misma tabla** que has consultado hasta ahora:

    ```sql theme={null}
    SELECT
        toYear(date) AS year,
        round(avg(price)) AS avg_price,
        count() AS sales
    FROM uk_price_paid
    WHERE town = 'LONDON'
    GROUP BY year
    ORDER BY year DESC;
    ```

    Comprueba las estadísticas de la consulta: se leen muchas menos filas que antes de que existiera la proyección, porque ClickHouse ha elegido automáticamente leer de la proyección `uk_price_paid_by_town` en lugar de escanear los datos base.

    Puedes confirmar que se ha usado la proyección con `EXPLAIN`:

    ```sql theme={null}
    EXPLAIN
    SELECT
        toYear(date) AS year,
        round(avg(price)) AS avg_price,
        count() AS sales
    FROM uk_price_paid
    WHERE town = 'LONDON'
    GROUP BY year
    ORDER BY year DESC;
    ```

    En la salida, busca `ReadFromMergeTree` con referencia al nombre de la proyección. Si quieres comparar el rendimiento explícitamente, puedes deshabilitar la optimización de proyecciones para una sola consulta:

    ```sql theme={null}
    SELECT
        toYear(date) AS year,
        round(avg(price)) AS avg_price,
        count() AS sales
    FROM uk_price_paid
    WHERE town = 'LONDON'
    GROUP BY year
    ORDER BY year DESC
    SETTINGS optimize_use_projections = 0;
    ```

    Esto obliga a realizar un escaneo completo de la tabla para que puedas ver la diferencia en el número de filas leídas.
  </Step>

  <Step>
    ### Comparación entre proyecciones y vistas materializadas

    Tanto las proyecciones como las vistas materializadas resuelven el mismo problema —lecturas más rápidas con patrones de acceso alternativos—, pero implican concesiones distintas. En resumen, las proyecciones son la mejor opción cuando solo necesitas un orden distinto para los mismos datos; las vistas materializadas son más flexibles cuando necesitas transformar, agregar o enrutar datos a un esquema diferente. Para una comparación detallada, consulta [Vistas materializadas frente a proyecciones](/es/concepts/features/projections/materialized-views-versus-projections).
  </Step>

  <Step>
    ### Observe la sobrecarga de almacenamiento

    Las proyecciones almacenan una segunda copia de las columnas seleccionadas dentro de la misma tabla, lo que incrementa el uso del disco. Consulta `system.parts` para ver el tamaño total de `uk_price_paid` (que ahora incluye los datos de la proyección):

    ```sql theme={null}
    SELECT
        table,
        count() AS parts,
        sum(rows) AS total_rows,
        formatReadableSize(sum(bytes_on_disk)) AS compressed_size
    FROM system.parts
    WHERE table = 'uk_price_paid'
      AND active = true
    GROUP BY table;
    ```

    También puedes consultar el almacenamiento específico de las proyecciones:

    ```sql theme={null}
    SELECT
        name,
        count() AS parts,
        sum(rows) AS total_rows,
        formatReadableSize(sum(bytes_on_disk)) AS projection_size
    FROM system.projection_parts
    WHERE table = 'uk_price_paid'
      AND active = true
    GROUP BY name;
    ```

    Esta es la misma disyuntiva fundamental que en las vistas materializadas: más espacio en disco a cambio de lecturas más rápidas. La proyección puede ser más pequeña que una copia completa porque solo incluye las cuatro columnas seleccionadas y la compresión varía según el orden de ordenación.
  </Step>
</Steps>

## Siguientes pasos

En esta guía de inicio rápido añadiste una proyección a `uk_price_paid` que almacena los datos ordenados por `(town, date)`, lo que permite búsquedas rápidas por localidad sin crear una tabla independiente. Aprendiste que el optimizador de consultas elige las proyecciones de forma transparente, que se mantienen sincronizadas con las mutaciones y que consumen espacio en disco a cambio de mejorar el rendimiento de lectura.

A continuación, consulta estas guías de inicio rápido:

O profundiza con la documentación de referencia:

* [Vistas materializadas frente a proyecciones](/es/concepts/features/projections/materialized-views-versus-projections)
* [Referencia de proyecciones](/es/reference/statements/alter/projection)
* [Motor de tabla MergeTree](/es/reference/engines/table-engines/mergetree-family/mergetree)

<Frame caption="Check out the ClickHouse academy for on-demand and live training">
  <a href="https://learn.clickhouse.com/" target="_blank">
    <img src="https://mintcdn.com/private-7c7dfe99-home-button/iOJBcv5hu2da8lsi/images/academy.png?fit=max&auto=format&n=iOJBcv5hu2da8lsi&q=85&s=102d3dcf8c90c04e86d2494a4b35541f" alt="ClickHouse Academy — Master ClickHouse with expert-designed training for every skill level" width="560" noZoom data-path="images/academy.png" />
  </a>
</Frame>

<div className="mt-8">
  <a href="/es/get-started/quickstarts/home"><Badge size="lg" color="gray" icon="arrow-left">Todas las guías de inicio rápido</Badge></a>
</div>
