mergeTreeCodecBlockCounts
mergeTreeCodecBlockCounts
MergeTree 테이블의 (파트, 컬럼, 서브스트림)별로 각 코덱을 사용하는 압축 블록 수를 보고하는 테이블 함수예요. 적응형 코덱 선택을 관찰하는 데 사용해요.
출처: 문서
본문
MergeTree 테이블의 (파트, 컬럼, 서브스트림)별로 각 코덱을 사용하는 압축 블록 수를 보고해요. 이걸로 적응형 코덱 선택(enable_adaptive_codec_selection 설정으로 활성화)을 관찰할 수 있는데, 이 기능은 기본 코덱 컬럼에 대해 블록마다 코덱을 선택할 수 있어요.
codec_block_counts를 선택하면 메타데이터뿐 아니라 .bin 데이터 파일도 읽어요. 나머지 컬럼은 메타데이터 전용이에요.
columns_substreams.txt에 서브스트림을 기록하지 않는 파트는 목록에 나오지 않아요.
보고되는 모든 값은 테이블 데이터에서 파생되므로, 결과의 어떤 컬럼이든 읽으려면 테이블의 모든 컬럼에 대한 SELECT 권한이 필요해요. 일부 컬럼만 다루는 권한으로는 충분하지 않아요. 이 권한은 DESCRIBE 같은 함수의 구조를 해석할 때도 필요해요. 테이블을 전혀 볼 수 없는 사용자, 즉 SHOW TABLES 권한이 없는 사용자는 테이블이 존재하든 아니든 ACCESS_DENIED를 받아요. 따라서 이 함수는 어떤 테이블이 존재하는지 그런 사용자에게 알려주지 않아요.
현재 사용자에 대해 행 정책이 테이블에 적용되는 경우 codec_block_counts를 읽으면 ACCESS_DENIED가 발생해요. 그 수치가 정책이 숨기는 행을 포함하기 때문이에요. 다른 컬럼은 계속 읽을 수 있고, system.parts_columns는 행 정책과 무관하게 이를 보고해요.
문법 (Syntax)
mergeTreeCodecBlockCounts(database, table)
인자 (Arguments)
| 인자 | 설명 |
|---|---|
database |
테이블의 데이터베이스 이름이에요. |
table |
MergeTree 테이블 이름이에요. |
반환값 (Returned value)
소스 테이블의 (활성 파트, 컬럼, 서브스트림)마다 한 행씩 있는 테이블 객체예요:
part_name(String) — 컬럼이 속한 활성 데이터 파트예요.column(String) — 컬럼 이름이에요.substream(String) — 수치가 집계되는 컬럼의 물리적 스트림이에요.system.parts_columns.substreams와 일치해요.data_compressed_bytes(Nullable(UInt64)) — 서브스트림의 압축 데이터 크기(바이트)예요.Compact파트에서는NULL이에요.data_uncompressed_bytes(Nullable(UInt64)) — 서브스트림의 비압축 데이터 크기(바이트)예요.Compact파트에서는NULL이에요.codec_block_counts(Map(String, UInt64)) — 이 서브스트림의 코덱별 압축 블록 수예요.Compact파트에서는 비어 있어요. 그런 파트의 컬럼은 하나의 데이터 파일을 공유하므로 스트림별 코덱 귀속이 없기 때문이에요.
사용 예시 (Usage example)
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} │
└────────┴───────────┴────────────────────┘
컬럼 수준 합계는 sumMap과 함께 GROUP BY column로 구해요:
SELECT column, sumMap(codec_block_counts)
FROM mergeTreeCodecBlockCounts(currentDatabase(), mt)
GROUP BY column;
LowCardinality 컬럼은 사전(dictionary)과 인덱스 스트림을 따로 보고해요:
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} │
└───────────┴────────────────────┘