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.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →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.
#1 Best Overall
¿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.
¿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.
Rank #3
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.
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
FINALcuando quieras que la lectura aplique directamente la semántica de reemplazo de la tabla. - Considera
argMaxcuando quieras construir explícitamente una agregación que seleccione valores por versión o fecha.
¿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.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallAl 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.
Best Value
¿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 BYidentifican 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
FINALo 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.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Scan for outdated or missing drivers - takes under a minute3Clear out junk files and repair common Windows errorsQuick Recap
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.

