eliminación ligera
antiguo principio de eliminación
La eliminación de ClickHouse se realiza mediante mutación, por ejemplo, queremos eliminar algunos registros:
ALTER TABLE test DELETE WHERE id < 100;
Se generará un archivo mutación_{block_number}.txt en el directorio de datos de la tabla de prueba, con el siguiente contenido:
format version: 1
create time: 2022-12-24 22:10:44
commands: DELETE WHERE id < 100
Los datos de cada parte se eliminarán después de que se ejecute la mutación, pero la ejecución de la mutación leerá todos los datos de la parte en la memoria, luego ejecutará la eliminación de datos y luego persistirá los datos procesados en el sistema de archivos. El proceso es pesado y puede ser muy lento.
Principio de eliminación ligero
ClickHouse actualmente implementa una eliminación ligera, es decir, se agrega una columna virtual _row_exists
para indicar si los datos de la fila se eliminan y _row_exists
hay dos valores: 0 (eliminado) y 1 (no eliminado). Esto convierte el proceso de mutación anterior en _row_exists
la lógica de actualizar columnas virtuales, porque ClickHouse solo procesa las columnas afectadas cuando realiza cambios de columna, y el resto de los archivos de columnas están vinculados a través de enlaces duros. Cuando hay muchas columnas, se ahorrará una gran cantidad de Operaciones IO.
Por supuesto, _row_exists
también será persistente, porque la operación de datos no se puede perder debido a un reinicio u otras razones, por lo que también se generarán archivos _row_exists.bin
y . _row_exists.mrk
Sin embargo, los archivos generados por esta columna no son datos realmente útiles, por lo que cuando la combinación parcial se ejecuta de forma asincrónica, los registros marcados para su eliminación se eliminarán y la columna ya no _row_exists
tendrá significado y se eliminará en consecuencia.
ejemplo
Crear una tabla MergeTree
CREATE TABLE test
(
`id` UInt64,
`value` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS
vertical_merge_algorithm_min_rows_to_activate = 1,
vertical_merge_algorithm_min_columns_to_activate = 1,
min_rows_for_wide_part = 1,
min_bytes_for_wide_part = 1;
Entre ellos, vertical_merge_algorithm_min_rows_to_activate
se vertical_merge_algorithm_min_columns_to_activate
establecen en 1 para permitir que MergeTree use el algoritmo vertical para fusionar (ClickHouse también tiene un algoritmo horizontal, la diferencia específica puede referirse a los escenarios de uso de los dos algoritmos de fusión (horizontal y vertical) ), min_rows_for_wide_part y min_bytes_for_wide_part se establecen en 1 para permitir que la parte de MergeTree use el modo ancho (es decir, cada columna es un archivo separado).
Entrada de datos
INSERT INTO test SELECT number AS id, toString(number) AS value FROM numbers(10);
Habilitar configuración de eliminación ligera
SET allow_experimental_lightweight_delete = 1;
En la actualidad, la función de eliminación ligera sigue siendo una función experimental y los parámetros de configuración anteriores deben establecerse en 1 para que surta efecto.
borrar algunos datos
DELETE FROM lwd_test WHERE (id % 3) = 0;
La eliminación ligera debe utilizar la cláusula DELETE, ya no utilizar la cláusula ALTER TABLE DELETE.
Después de la ejecución, puede encontrar que hay un archivo mutación_2.txt adicional en el directorio de datos de prueba, el contenido es:
format version: 1
create time: 2022-12-24 22:44:43
commands: UPDATE _row_exists = 0 WHERE (id % 3) = 0
Se puede ver que la operación BORRAR se transforma en una operación ACTUALIZAR.
En el directorio de piezas bajo observación, la lista de archivos es:
-rw-r----- 1 ck ck 36B 12 24 22:44 _row_exists.bin
-rw-r----- 1 ck ck 48B 12 24 22:44 _row_exists.mrk2
-rw-r----- 1 ck ck 328B 12 24 22:44 checksums.txt
-rw-r----- 1 ck ck 84B 12 24 22:44 columns.txt
-rw-r----- 1 ck ck 2B 12 24 22:42 count.txt
-rw-r----- 1 ck ck 10B 12 24 22:44 default_compression_codec.txt
-rw-r----- 1 ck ck 70B 12 24 22:42 id.bin
-rw-r----- 1 ck ck 48B 12 24 22:42 id.mrk2
-rw-r----- 1 ck ck 16B 12 24 22:42 primary.idx
-rw-r----- 1 ck ck 47B 12 24 22:42 value.bin
-rw-r----- 1 ck ck 48B 12 24 22:42 value.mrk2
Se puede ver que hay más _row_exists.bin
archivos _row_exists.mrk2
, lo que indica que la eliminación de la marca ha persistido.
Ejecutar fusión forzada
OPTIMIZE TABLE test FINAL
Después de ejecutar OPTIMIZE, las partes de cada partición se fusionarán en una sola parte y, si observa el directorio de la parte recién generada, encontrará que no hay _row_exists
archivos relacionados.
Bienvenido a agregar WX: xiedeyantu para discutir problemas técnicos.