【Serie ClickHouse】 Principio de eliminación ligera de ClickHouse

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_existspara indicar si los datos de la fila se eliminan y _row_existshay dos valores: 0 (eliminado) y 1 (no eliminado). Esto convierte el proceso de mutación anterior en _row_existsla 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_existstambié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.biny . _row_exists.mrkSin 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_activatese vertical_merge_algorithm_min_columns_to_activateestablecen 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.binarchivos _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.

Supongo que te gusta

Origin blog.csdn.net/weixin_39992480/article/details/128462618
Recomendado
Clasificación