Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

En ClickHouse, un upsert con ReplacingMergeTree normalmente inserta una nueva versión de la fila; no actualiza la anterior en el sitio. Los merges de fondo pueden retirar versiones antiguas más adelante, pero una consulta normal puede verlas mientras tanto. Para obtener el estado deduplicado en una lectura, usa FINAL y diseña ORDER BY, la columna de versión y el particionamiento para que las versiones de una misma fila puedan reemplazarse entre sí.

¿Cómo funciona un upsert en ReplacingMergeTree?

ReplacingMergeTree representa una actualización insertando otra fila con la misma clave de ordenación. La tabla puede conservar físicamente ambas versiones durante un tiempo; los merges de fondo consolidan partes de forma asíncrona y pueden descartar las versiones anteriores.

Un pedido con dos versiones

Imagina una tabla de partidas de pedido ordenada por (order_id, item_id). La primera inserción guarda el estado original. Si luego cambia la cantidad, se inserta otra fila con el mismo order_id y item_id, pero con una versión mayor. ClickHouse describe este patrón como insertar una versión nueva con la misma clave de ordenación.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Por tanto, no es una actualización en sitio ni una restricción de unicidad transaccional que garantice una sola fila visible inmediatamente. El estado lógico actual se representa mediante la versión ganadora, aunque las versiones antiguas puedan seguir presentes físicamente hasta que se consoliden.

¿Qué determina qué fila gana?

La identidad la define ORDER BY

El motor busca filas reemplazables usando las columnas de ORDER BY. Esa clave debe representar la identidad estable de la fila lógica, no solo servir para ordenar o acelerar consultas. Si cambia la propia clave de ordenación de una fila, la nueva fila ya no comparte la identidad que el motor usa para reemplazarla.

Usa una versión explícita

Al configurar una columna de versión, gana la fila con el valor de versión más alto. Esto es especialmente importante en cargas CDC, donde los cambios pueden llegar fuera de orden: la versión lógica permite seleccionar el cambio más reciente según ese orden, en vez de depender de qué parte participa primero en un merge.

Sin una columna de versión, el resultado depende del orden de merge. Para una carga de actualizaciones, una versión explícita hace que la elección de la fila ganadora sea más predecible. La versión debe reflejar el orden de cambios que el sistema de origen considera válido.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

¿Por qué una consulta normal puede mostrar duplicados?

Los merges de fondo son asíncronos y trabajan sobre partes de datos. Hasta que las partes pertinentes se consolidan, una lectura ordinaria puede devolver más de una versión con la misma clave de ordenación. Ver esas filas no significa necesariamente que la inserción haya fallado: es parte del comportamiento del motor antes de la consolidación.

Además, los merges ordinarios ocurren dentro de cada partición. Si las versiones de una misma identidad lógica terminan en particiones diferentes, no se debe asumir que un merge de fondo las reunirá para reemplazo. El diseño debe mantener juntas las versiones que deban competir entre sí.

¿Cuándo conviene usar SELECT … FINAL?

SELECT ... FINAL aplica la lógica de reemplazo durante la lectura y devuelve el estado deduplicado para esa consulta, sin esperar a que los merges de fondo hayan consolidado las partes. Es una opción explícita para consultas que necesitan el estado actual correcto en ese momento, a cambio de trabajo adicional de lectura.

SELECT order_id, item_id, quantity
FROM orders FINAL
WHERE order_id = 42;

El ejemplo presupone que la tabla está diseñada para que las versiones relevantes compartan identidad y partición. La sintaxis concreta y el coste dependen de la versión desplegada, el esquema y la consulta; conviene validar la consulta sobre la tabla real.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Aplicar FINAL a las tablas de una consulta

La configuración final = 1 permite aplicar el comportamiento FINAL a las tablas de la consulta. Puede ser útil cuando se quiere activar esa semántica mediante configuración en vez de escribir el modificador junto a cada tabla. No elimina el trabajo adicional que implica resolver las versiones durante la lectura.

FINAL no es OPTIMIZE TABLE … FINAL

SELECT ... FINAL calcula el estado reemplazado para la consulta; no fuerza por sí mismo la consolidación física de las partes. En cambio, OPTIMIZE TABLE ... FINAL solicita un merge físico forzado. Ese trabajo puede aumentar la presión sobre los recursos y las réplicas, por lo que no es un sustituto rutinario de usar FINAL al leer.

¿Cómo afectan el particionamiento y la clave de ordenación?

  • Mantén estable la identidad: las versiones que deben reemplazarse necesitan compartir las columnas de ORDER BY.
  • Evita separar versiones: escoge una clave de partición que no cambie para la fila lógica a medida que se actualiza. Una fecha de partición que cambia con la actualización puede enviar versiones de la misma fila a particiones distintas.
  • No presupongas merges entre particiones: los merges ordinarios operan dentro de cada partición. El diseño debe hacer coincidir la ubicación de los datos con la semántica de reemplazo que se espera.
  • Activa la optimización solo con su garantía: usa do_not_merge_across_partitions_select_final = 1 únicamente si las versiones relevantes permanecen en la misma partición. Sin esa garantía, la configuración no respeta el objetivo de comparar todas las versiones de la identidad.

¿Cómo elegir entre FINAL y argMax?

argMax es otro patrón para escoger valores asociados a la mayor versión o fecha. No es una regla universal que sea más rápido o más lento que FINAL: la consulta concreta determina cuál expresa mejor el resultado deseado, y cualquier diferencia de rendimiento debe medirse en el esquema y la carga reales.

  • Elige FINAL cuando quieras que la lectura aplique directamente la semántica de reemplazo de la tabla.
  • Considera argMax cuando quieras construir explícitamente una agregación que seleccione valores por versión o fecha.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

¿Qué ocurre al borrar una fila?

La variante ReplacingMergeTree(version, deleted) puede conservar como ganadora una fila marcada como borrada. Esa marca permite excluirla del estado visible, pero la inserción de la marca no implica que el registro desaparezca físicamente en ese instante.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Al construir una consulta del estado actual, excluye explícitamente las filas cuyo indicador de borrado esté activo. Define también cuánto tiempo deben conservarse esos registros marcados y cómo encaja esa retención con la necesidad de consultar o reconstruir el historial.

¿Es lo mismo que un UPDATE ligero?

No. El patrón de este artículo inserta una fila completa con una nueva versión para que ReplacingMergeTree reemplace la anterior. Los UPDATE ligeros de ClickHouse usan patch parts, que se aplican durante la lectura y los merges; son un mecanismo distinto.

La elección depende del patrón de cambio, de la versión desplegada y del diseño de los datos. No hay una regla que haga apropiado un mecanismo para todas las cargas. La formación de ClickHouse Academy incluye contenidos sobre motores de deduplicación, mutaciones y patrones de lectura como FINAL y argMax.

Comprobaciones antes de usar este patrón

  • ¿Las columnas de ORDER BY identifican de forma estable la fila que quieres versionar?
  • ¿Cada nueva versión reutiliza esa identidad, incluso si cambian otros valores?
  • ¿Hay una columna de versión que permita elegir el cambio lógico más reciente, incluso si los eventos llegan fuera de orden?
  • ¿Las versiones que deben reemplazarse permanecen en la misma partición?
  • ¿Las consultas que requieren estado actual usan FINAL o una selección explícita por versión, en lugar de depender de que los merges ya hayan ocurrido?
  • ¿El tratamiento de las filas marcadas como borradas está definido en las consultas y en la política de retención?

La documentación y los ejemplos de ClickHouse sustentan estas semánticas, pero no determinan por sí solos la sintaxis, los ajustes ni el coste óptimos para una instalación concreta. Verifica el comportamiento con la versión desplegada y el esquema real.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.