> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Informa, para cada (parte, coluna, subfluxo) de uma tabela MergeTree, quantos blocos comprimidos usam cada codec.

# 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.

<div id="syntax">
  ## Sintaxe
</div>

```sql theme={null}
mergeTreeCodecBlockCounts(database, table)
```

<div id="arguments">
  ## Argumentos
</div>

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

<div id="returned-value">
  ## Valor retornado
</div>

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

* `part_name` ([String](/docs/pt-BR/reference/data-types/string)) — A parte de dados ativa à qual a coluna pertence.
* `column` ([String](/docs/pt-BR/reference/data-types/string)) — O nome da coluna.
* `substream` ([String](/docs/pt-BR/reference/data-types/string)) — O fluxo físico da coluna ao qual as contagens se referem. Corresponde a `system.parts_columns.substreams`.
* `data_compressed_bytes` ([Nullable(UInt64)](/docs/pt-BR/reference/data-types/nullable)) — Tamanho dos dados comprimidos no subfluxo, em bytes. `NULL` para partes `Compact`.
* `data_uncompressed_bytes` ([Nullable(UInt64)](/docs/pt-BR/reference/data-types/nullable)) — Tamanho dos dados não comprimidos no subfluxo, em bytes. `NULL` para partes `Compact`.
* `codec_block_counts` ([Map(String, UInt64)](/docs/pt-BR/reference/data-types/map)) — 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.

<div id="usage-example">
  ## Exemplo de uso
</div>

```sql theme={null}
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);
```

```text theme={null}
┌─column─┬─substream─┬─codec_block_counts─┐
│ a      │ a         │ {'LZ4':13}         │
└────────┴───────────┴────────────────────┘
```

Os totais por coluna são um `GROUP BY column` com [`sumMap`](/docs/pt-BR/reference/functions/aggregate-functions/sumMap):

```sql theme={null}
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:

```sql theme={null}
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;
```

```text theme={null}
┌─substream─┬─codec_block_counts─┐
│ s         │ {'LZ4':31}         │
│ s.dict    │ {'LZ4':1}          │
└───────────┴────────────────────┘
```
