Indica, para cada (parte, columna, subflujo) de una tabla MergeTree, cuántos bloques comprimidos usan cada códec. Permite observar la selección adaptativa de códecs (habilitada por la configuración allow_experimental_adaptive_codec_selection), que puede elegir un códec por bloque para las columnas que usan el códec predeterminado.
La selección de codec_block_counts lee archivos de datos .bin, no solo metadatos. Las demás columnas solo contienen metadatos.
No se incluyen las partes que no registran sus subflujos en columns_substreams.txt.
Si se aplica una política de filas a la tabla para el usuario actual, la lectura de codec_block_counts genera ACCESS_DENIED, ya que los recuentos incluirían filas que la política oculta. Las demás columnas siguen siendo legibles; system.parts_columns las informa independientemente de las políticas de filas.
Sintaxis
mergeTreeCodecBlockCounts(database, table)Argumentos
| Argumento | Descripción |
|---|---|
database |
El nombre de la base de datos de la tabla. |
table |
El nombre de la tabla MergeTree. |
Valor devuelto
Un objeto de tabla con una fila por cada combinación de (parte activa, columna y subflujo) de la tabla de origen:
part_name(String) — La parte de datos activa a la que pertenece la columna.column(String) — El nombre de la columna.substream(String) — El flujo físico de la columna al que corresponden los recuentos. Coincide consystem.parts_columns.substreams.data_compressed_bytes(Nullable(UInt64)) — Tamaño de los datos comprimidos en el subflujo, en bytes.NULLpara las partesCompact.data_uncompressed_bytes(Nullable(UInt64)) — Tamaño de los datos sin comprimir en el subflujo, en bytes.NULLpara las partesCompact.codec_block_counts(Map(String, UInt64)) — Número de bloques comprimidos de este subflujo, agrupados por códec. Vacío para las partesCompact, cuyas columnas comparten un archivo de datos y, por tanto, no tienen una atribución de códec por flujo.
Ejemplo de uso
CREATE TABLE mt (a UInt64) ENGINE = MergeTree ORDER BY a
SETTINGS min_bytes_for_wide_part = 0;
INSERT INTO mt SELECT number FROM numbers(100000);
SELECT column, substream, codec_block_counts
FROM mergeTreeCodecBlockCounts(currentDatabase(), mt);┌─column─┬─substream─┬─codec_block_counts─┐
│ a │ a │ {'LZ4':13} │
└────────┴───────────┴────────────────────┘Los totales por columna se obtienen mediante un GROUP BY column con sumMap:
SELECT column, sumMap(codec_block_counts)
FROM mergeTreeCodecBlockCounts(currentDatabase(), mt)
GROUP BY column;Una columna LowCardinality informa de forma independiente los flujos del diccionario y de los índices:
CREATE TABLE mt_lc (s LowCardinality(String)) ENGINE = MergeTree ORDER BY tuple()
SETTINGS min_bytes_for_wide_part = 0;
INSERT INTO mt_lc SELECT toString(number % 1000) FROM numbers(1000000);
SELECT substream, codec_block_counts
FROM mergeTreeCodecBlockCounts(currentDatabase(), mt_lc)
WHERE column = 's'
ORDER BY substream;┌─substream─┬─codec_block_counts─┐
│ s │ {'LZ4':31} │
│ s.dict │ {'LZ4':1} │
└───────────┴────────────────────┘