Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

mergeTreeCodecBlockCounts

Informa, para cada (parte, coluna, subfluxo) de uma tabela MergeTree, quantos blocos comprimidos usam cada codec. Assim, é possível observar a seleção adaptativa de codec (habilitada pela configuração allow_experimental_adaptive_codec_selection), que pode escolher um codec por bloco para colunas com o codec padrão.

A seleção de codec_block_counts lê arquivos de dados .bin, e não apenas metadados. As outras colunas contêm somente metadados.

As partes que não registram seus subfluxos em columns_substreams.txt não são listadas.

Se uma política de linha se aplicar à tabela para o usuário atual, a leitura de codec_block_counts lança ACCESS_DENIED, pois as contagens abrangeriam linhas ocultadas pela política. As outras colunas permanecem legíveis; system.parts_columns as informa independentemente das políticas de linha.

Sintaxe

mergeTreeCodecBlockCounts(database, table)

Argumentos

Argumento Descrição
database O nome do banco de dados da tabela.
table O nome da tabela MergeTree.

Valor retornado

Um objeto de tabela com uma linha para cada combinação de (parte ativa, coluna, subfluxo) da tabela de origem:

  • part_name (String) — A parte de dados ativa à qual a coluna pertence.
  • column (String) — O nome da coluna.
  • substream (String) — O fluxo físico da coluna ao qual as contagens se referem. Corresponde a system.parts_columns.substreams.
  • data_compressed_bytes (Nullable(UInt64)) — Tamanho dos dados comprimidos no subfluxo, em bytes. NULL para partes Compact.
  • data_uncompressed_bytes (Nullable(UInt64)) — Tamanho dos dados não comprimidos no subfluxo, em bytes. NULL para partes Compact.
  • codec_block_counts (Map(String, UInt64)) — Número de blocos comprimidos deste subfluxo, agrupados por codec. Vazio para partes Compact, cujas colunas compartilham um único arquivo de dados e, portanto, não possuem atribuição de codec por fluxo.

Exemplo 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}         │
└────────┴───────────┴────────────────────┘

Os totais por coluna são um GROUP BY column com sumMap:

SELECT column, sumMap(codec_block_counts)
FROM mergeTreeCodecBlockCounts(currentDatabase(), mt)
GROUP BY column;

Uma coluna LowCardinality relata separadamente os fluxos do dicionário e dos í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}          │
└───────────┴────────────────────┘
Navigation