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

> 报告 MergeTree 表中每个（分片、列、子流）使用各编解码器的压缩块数量。

# mergeTreeCodecBlockCounts

按 MergeTree 表的每个 (分片、列、子流) 统计使用各编解码器的压缩块数量。借此可观察自适应编解码器选择 (由 `allow_experimental_adaptive_codec_selection` 设置启用) ：该功能可为使用默认编解码器的列中每个块选择编解码器。

选择 `codec_block_counts` 会读取 `.bin` 数据文件，而不只是元数据。其他列仅读取元数据。

未在 `columns_substreams.txt` 中记录子流的 分片 不会列出。

如果行策略适用于当前用户访问该表，读取 `codec_block_counts` 会引发 `ACCESS_DENIED`，因为计数会包含被该策略隐藏的行。其他列仍可读取，`system.parts_columns` 不受行策略影响，仍会报告这些列。

<div id="syntax">
  ## 语法
</div>

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

<div id="arguments">
  ## 参数
</div>

| 参数         | 描述             |
| ---------- | -------------- |
| `database` | 表的数据库名称。       |
| `table`    | MergeTree 表名称。 |

<div id="returned-value">
  ## 返回值
</div>

一个表对象，源表中每个 (活动分片、列、子流) 组合对应一行：

* `part_name` ([String](/docs/zh/reference/data-types/string)) — 该列所属的活动分片。
* `column` ([String](/docs/zh/reference/data-types/string)) — 列名。
* `substream` ([String](/docs/zh/reference/data-types/string)) — 计数对应的列物理流。与 `system.parts_columns.substreams` 一致。
* `data_compressed_bytes` ([Nullable(UInt64)](/docs/zh/reference/data-types/nullable)) — 子流中压缩数据的大小，单位为字节。对于 `Compact` 分片，值为 `NULL`。
* `data_uncompressed_bytes` ([Nullable(UInt64)](/docs/zh/reference/data-types/nullable)) — 子流中未压缩数据的大小，单位为字节。对于 `Compact` 分片，值为 `NULL`。
* `codec_block_counts` ([Map(String, UInt64)](/docs/zh/reference/data-types/map)) — 此子流中按 codec 分组的压缩块数量。对于 `Compact` 分片，该值为空，因为其列共用一个数据文件，因此无法按流归属 codec。

<div id="usage-example">
  ## 使用示例
</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}         │
└────────┴───────────┴────────────────────┘
```

列级汇总是按列执行的 `GROUP BY`，并使用 [`sumMap`](/docs/zh/reference/functions/aggregate-functions/sumMap)：

```sql theme={null}
SELECT column, sumMap(codec_block_counts)
FROM mergeTreeCodecBlockCounts(currentDatabase(), mt)
GROUP BY column;
```

`LowCardinality` 列会分别显示其字典流和索引流：

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