Limitaciones
Estado incierto de la inserción
Límite de la ventana de deduplicación
*_deduplication_window operaciones de inserción adicionales, es posible que la deduplicación no funcione correctamente. En ese caso, los mismos datos pueden insertarse varias veces.
Habilitar la deduplicación de inserciones en caso de reintentos
Deduplicación de inserción para tablas
*MergeTree admiten la deduplicación durante la inserción.
Para los motores *ReplicatedMergeTree, la deduplicación de inserción está habilitada de forma predeterminada y se controla mediante los ajustes replicated_deduplication_window y replicated_deduplication_window_seconds. Para los motores *MergeTree no replicados, la deduplicación se controla mediante el ajuste non_replicated_deduplication_window.
Los ajustes anteriores determinan los parámetros del registro de deduplicación de una tabla. El registro de deduplicación almacena un número finito de block_id, que determinan cómo funciona la deduplicación (véase más abajo).
Deduplicación de inserciones a nivel de consulta
insert_deduplicate=1 habilita la deduplicación a nivel de consulta. Tenga en cuenta que, si inserta datos con insert_deduplicate=0, esos datos no pueden deduplicarse aunque vuelva a intentar una inserción con insert_deduplicate=1. Esto se debe a que, en las inserciones con insert_deduplicate=0, no se escriben block_id para los bloques.
Cómo funciona la deduplicación de inserciones
*MergeTree, a cada bloque se le asigna un block_id único, que es un hash de los datos de ese bloque. Este block_id se utiliza como clave única para la operación de inserción. Si se encuentra el mismo block_id en el registro de deduplicación, el bloque se considera duplicado y no se inserta en la tabla.
Este enfoque funciona bien cuando las inserciones contienen datos distintos. Sin embargo, si los mismos datos se insertan varias veces de forma intencionada, debes usar la configuración insert_deduplication_token para controlar el proceso de deduplicación. Esta configuración te permite especificar un token único para cada inserción, que ClickHouse utiliza para determinar si los datos están duplicados.
Para las consultas INSERT ... VALUES, la división de los datos insertados en bloques es determinista y viene determinada por la configuración. Por lo tanto, debes reintentar las inserciones con los mismos valores de configuración que en la operación inicial.
Para las consultas INSERT ... SELECT, es importante que la parte SELECT de la consulta devuelva los mismos datos en el mismo orden en cada operación. Ten en cuenta que esto es difícil de conseguir en la práctica. Para garantizar un orden estable de los datos en los reintentos, define una cláusula ORDER BY ALL en la parte SELECT de la consulta. En este momento, debes usar exactamente ORDER BY ALL en la consulta. La compatibilidad con ORDER BY aún no está implementada y la parte SELECT de la consulta no se consideraría estable. Ten en cuenta que es posible que la tabla seleccionada se actualice entre reintentos; los datos del resultado podrían haber cambiado y no se producirá la deduplicación. Además, cuando insertas grandes cantidades de datos, es posible que el número de bloques tras las inserciones desborde la ventana del registro de deduplicación, y ClickHouse no sabrá que debe deduplicar los bloques.
En este momento, el comportamiento de INSERT ... SELECT está controlado por la configuración insert_select_deduplicate. Esta configuración determina si la deduplicación se aplica a los datos insertados mediante consultas INSERT ... SELECT. Consulta la documentación enlazada para obtener más detalles y ejemplos de uso.
Deduplicación de inserciones con vistas materializadas
replicated_deduplication_windowreplicated_deduplication_window_secondsnon_replicated_deduplication_window
deduplicate_blocks_in_dependent_materialized_views.
Con el ajuste insert_deduplicate=1 habilitado, los datos insertados se deduplican en la tabla de origen. El ajuste deduplicate_blocks_in_dependent_materialized_views=1 habilita además la deduplicación en las tablas dependientes. Debe habilitar ambos si desea una deduplicación completa.
Al insertar bloques en tablas asociadas a vistas materializadas, ClickHouse calcula el block_id aplicando un hash a una cadena que combina los block_id de la tabla de origen con identificadores adicionales. Esto garantiza una deduplicación precisa dentro de las vistas materializadas, lo que permite distinguir los datos según su inserción original, independientemente de cualquier transformación aplicada antes de llegar a la tabla de destino de la vista materializada.
Ejemplos
Bloques idénticos tras las transformaciones de una vista materializada
dst. 2 bloques del select — 2 partes al insertar. Las partes contienen datos diferentes.
mv_dst. Esas partes contienen los mismos datos; sin embargo, no se han deduplicado.
dst como mv_dst.
Bloques idénticos al insertar
dst. Sin embargo, vemos que solo se ha insertado un bloque en la tabla dst. Esto ocurrió porque el segundo bloque se ha deduplicado. Tiene los mismos datos y la clave de deduplicación block_id, que se calcula como un hash a partir de los datos insertados. Este comportamiento no era el esperado. Estos casos son poco frecuentes, pero teóricamente son posibles. Para manejar estos casos correctamente, el usuario tiene que proporcionar un insert_deduplication_token. Corrijámoslo con los siguientes ejemplos:
Bloques idénticos durante la inserción con insert_deduplication_token
insert_deduplication_token tiene prioridad: ClickHouse no usa la suma hash de los datos cuando se proporciona insert_deduplication_token.
Diferentes operaciones de inserción generan los mismos datos tras la transformación en la tabla subyacente de la vista materializada
mv_dst se insertan los mismos datos. Los datos no se deduplican porque los datos de entrada eran distintos.
Diferentes inserciones de vistas materializadas en una misma tabla subyacente con datos equivalentes
mv_dst (como se esperaba).
dst y mv_dst.