Indique, pour chaque combinaison (partie, colonne, sous-flux) d’une table MergeTree, combien de blocs compressés utilisent chaque codec. Cela permet d’observer la sélection adaptative de codec (activée par le paramètre allow_experimental_adaptive_codec_selection), qui peut choisir un codec par bloc pour les colonnes utilisant le codec par défaut.
La sélection de codec_block_counts lit les fichiers de données .bin, et non uniquement les métadonnées. Les autres colonnes ne contiennent que des métadonnées.
Les parties qui n’enregistrent pas leurs sous-flux dans columns_substreams.txt ne sont pas répertoriées.
Si une politique de lignes s’applique à la table pour l’utilisateur courant, la lecture de codec_block_counts génère ACCESS_DENIED, car les décomptes incluraient des lignes masquées par la politique. Les autres colonnes restent lisibles ; system.parts_columns les indique indépendamment des politiques de lignes.
Syntaxe
mergeTreeCodecBlockCounts(database, table)Arguments
| Argument | Description |
|---|---|
database |
Le nom de la base de données de la table. |
table |
Le nom de la table MergeTree. |
Valeur renvoyée
Un objet table comportant une ligne par (partie active, colonne, sous-flux) de la table source :
part_name(String) — La partie de données active à laquelle appartient la colonne.column(String) — Le nom de la colonne.substream(String) — Le flux physique de la colonne auquel se rapportent les décomptes. Correspond àsystem.parts_columns.substreams.data_compressed_bytes(Nullable(UInt64)) — Taille des données compressées du sous-flux, en octets.NULLpour les partiesCompact.data_uncompressed_bytes(Nullable(UInt64)) — Taille des données non compressées du sous-flux, en octets.NULLpour les partiesCompact.codec_block_counts(Map(String, UInt64)) — Nombre de blocs compressés de ce sous-flux, regroupés par codec. Vide pour les partiesCompact, dont les colonnes partagent un même fichier de données et ne disposent donc pas d’une attribution de codec par flux.
Exemple d'utilisation
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} │
└────────┴───────────┴────────────────────┘Les totaux par colonne s’obtiennent avec un GROUP BY column et sumMap :
SELECT column, sumMap(codec_block_counts)
FROM mergeTreeCodecBlockCounts(currentDatabase(), mt)
GROUP BY column;Une colonne LowCardinality indique séparément les flux de son dictionnaire et de ses index :
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} │
└───────────┴────────────────────┘