DELETE de eliminación ligera elimina las filas de la tabla [db.]table que coinciden con la expresión expr. Solo está disponible para la familia de motores de tabla *MergeTree.
DELETE ligero” para diferenciarlo del comando ALTER TABLE … DELETE, que es un proceso costoso.
Ejemplos
eliminación ligera no elimina los datos de inmediato
La eliminación ligera marca las filas como eliminadas sin quitarlas de inmediato del almacenamiento. De forma predeterminada, utiliza una mutación. También puede utilizar partes de parche, según la configuraciónlightweight_delete_mode.
Con el modo predeterminado basado en mutaciones, las sentencias DELETE esperan a que se complete el marcado de las filas como eliminadas antes de finalizar. Esto puede llevar mucho tiempo si el volumen de datos es grande. Como alternativa, puede ejecutarlo de forma asíncrona en segundo plano mediante la configuración lightweight_deletes_sync. Si está deshabilitada, la sentencia DELETE devolverá el resultado de inmediato, pero los datos pueden seguir siendo visibles para las consultas hasta que finalice la mutación en segundo plano.
En ambos modos, las filas eliminadas permanecen en el almacenamiento hasta que se limpian. Normalmente, las fusiones en segundo plano las eliminan de las partes de datos afectadas. Para aplicar explícitamente la máscara de eliminación, utilice ALTER TABLE ... APPLY DELETED MASK, que realiza una mutación pesada.
Si necesita garantizar que sus datos se eliminen del almacenamiento en un tiempo predecible, considere usar la configuración de tabla min_age_to_force_merge_seconds. O bien, puede usar el comando ALTER TABLE … DELETE. Tenga en cuenta que eliminar datos con ALTER TABLE ... DELETE puede consumir una cantidad significativa de recursos, ya que vuelve a crear todas las partes afectadas.
Elija el modo de eliminación
La configuraciónlightweight_delete_mode permite elegir entre eliminaciones mediante mutaciones (la opción predeterminada) y actualizaciones ligeras que escriben partes de parche con _row_exists = 0 para las filas eliminadas. Las consultas aplican estos parches antes de la eliminación física de las filas.
Consulte la referencia de esta configuración para conocer los modos disponibles y los requisitos de las actualizaciones ligeras para conocer las condiciones previas. Cuando se usan partes de parche, lightweight_deletes_sync no espera a las demás réplicas; en ReplicatedMergeTree, estas pueden seguir devolviendo filas eliminadas hasta que reciban el parche.
Eliminación de grandes volúmenes de datos
Las eliminaciones de gran volumen pueden afectar negativamente el rendimiento de ClickHouse. Si intenta eliminar todas las filas de una tabla, considere usar el comandoTRUNCATE TABLE.
Si prevé eliminaciones frecuentes, considere usar una clave de particionamiento personalizada. Después, puede usar el comando ALTER TABLE ... DROP PARTITION para eliminar rápidamente todas las filas asociadas a esa partición.
Limitaciones de la eliminación ligera
Eliminaciones ligeras con proyecciones
De forma predeterminada,DELETE no funciona en tablas con proyecciones. Esto se debe a que las filas de una proyección pueden verse afectadas por una operación DELETE. Sin embargo, existe la configuración de MergeTree lightweight_mutation_projection_mode para cambiar este comportamiento.
Consideraciones de rendimiento al usar eliminación ligera
Eliminar grandes volúmenes de datos con la sentencia de eliminación ligera puede afectar negativamente el rendimiento de las consultas SELECT. Los siguientes factores también pueden afectar negativamente el rendimiento de la eliminación ligera:- Una condición
WHEREcompleja en una consultaDELETE. - En el caso de eliminaciones basadas en mutaciones, una cola de mutaciones grande: las mutaciones de una tabla se ejecutan de forma secuencial.
- La tabla afectada tiene una cantidad muy grande de partes de datos.
- Al usar eliminaciones basadas en mutaciones, tener muchos datos en partes compactas. En una parte compacta, todas las columnas se almacenan en un único archivo y deben reescribirse juntas.
Permisos de DELETE
DELETE requiere el privilegio ALTER DELETE. Para habilitar las Sentencias DELETE en una tabla específica para un usuario determinado, ejecute el siguiente comando:
Cómo funcionan internamente las eliminaciones ligeras en ClickHouse
-
Se aplica una “máscara” a las filas afectadas
Cuando se ejecuta una consulta
DELETE FROM table ..., ClickHouse guarda una máscara en la que cada fila queda marcada como “existente” o “eliminada”. Esas filas “eliminadas” se omiten en las consultas posteriores. Sin embargo, las filas se eliminan físicamente más adelante, normalmente durante las fusiones en segundo plano. Escribir esta máscara es mucho más ligero que lo que se hace con una consultaALTER TABLE ... DELETE. La máscara se implementa como una columna de sistema oculta,_row_exists, que almacenaTruepara todas las filas visibles yFalsepara las eliminadas. Esta columna solo está presente en una parte si se eliminaron algunas filas de esa parte. No existe cuando una parte tiene todos sus valores iguales aTrue. -
Las consultas
SELECTse transforman para incluir la máscara Cuando se usa una columna enmascarada en una consulta, la consultaSELECT ... FROM table WHERE conditionse amplía internamente con el predicado sobre_row_existsy se transforma en:En tiempo de ejecución, la columna_row_existsse lee para determinar qué filas no deben devolverse. Si hay muchas filas eliminadas, ClickHouse puede determinar qué gránulos pueden omitirse por completo al leer el resto de las columnas. -
Las consultas
DELETEactualizan la máscara mediante el modo seleccionado Con las partes de parche,DELETE FROM table WHERE conditionse traduce enUPDATE table SET _row_exists = 0 WHERE condition. Las partes de parche resultantes almacenan los cambios en la máscara correspondientes a las filas eliminadas y se aplican al leer y fusionar los datos. Con el modo predeterminadoalter_update,DELETE FROM table WHERE conditionse traduce en una mutaciónALTER TABLE table UPDATE _row_exists = 0 WHERE condition. Internamente, esta mutación se ejecuta en dos pasos:-
Se ejecuta un comando
SELECT count() FROM table WHERE conditionpara cada parte individual, a fin de determinar si esa parte está afectada. -
A partir de los comandos anteriores, se aplican mutaciones a las partes afectadas y se crean enlaces físicos para las partes no afectadas. En el caso de las partes wide, se actualiza la columna
_row_existsde cada fila, y los archivos de todas las demás columnas se enlazan mediante enlaces físicos. En el caso de las partes compact, todas las columnas se reescriben porque se almacenan juntas en un solo archivo.
ALTER TABLE ... DELETEtradicional porque no reescribe todos los archivos de columnas de las partes afectadas. -
Se ejecuta un comando