system.tables 里有什么
system.tables 汇总所有表的引擎、排序键、分区键、主键、行数与磁盘占用,还提供 create_table_query 字段可以直接取出建表语句。它适合做巡检、盘点大表与复制结构,是排查"这张表是怎么建的"的第一站。
和 system.parts 怎么配合
system.tables 里的行数与字节数来自元数据估算,精确核对要以 system.parts 的聚合为准;单表的 part 数量、分区分布与压缩情况也都在 system.parts 里查。要看列定义则用 system.columns,可按数据库与表过滤,拿到类型、默认表达式与压缩编码。
基本信息
| 关键列 | database、name、engine、sorting_key、partition_key、total_rows、total_bytes、create_table_query |
|---|---|
| 配合使用 | system.columns 查列定义,system.parts 查 part 与分区 |
| 过滤建议 | 按 database 过滤业务库,排除 system 库 |
| 权限 | 查看系统表需要对应库的读取权限 |
| 适用版本 | 各主流版本字段基本一致,新版本会追加列 |
示例
示例
SELECT
name,
engine,
sorting_key,
formatReadableSize(total_bytes) AS size
FROM system.tables
WHERE database = 'analytics'
ORDER BY total_bytes DESC;
-- 列定义:类型、默认表达式与压缩编码
SELECT name, type, default_expression, compression_codec
FROM system.columns
WHERE database = 'analytics' AND table = 'events';
-- part 视图:确认分区分布与合并情况
SELECT partition, count() AS parts, sum(rows) AS rows
FROM system.parts
WHERE table = 'events' AND active
GROUP BY partition ORDER BY partition;典型使用场景
- 盘点大表:按占用排序找出需要治理的表
- 结构核对:确认排序键与分区键是否符合设计要求
- 迁移复制:用 create_table_query 拿到可复用的建表语句
- 写入排查:结合 system.parts 看 part 数量是否异常增长
- 元数据巡检:定期检查空表、临时表与重复结构
常用列读法
| 列 | 含义 | 注意 |
|---|---|---|
| engine | 表引擎 | 区分 MergeTree 家族与分布式表 |
| sorting_key | 排序键 | 影响合并效率与查询效率 |
| partition_key | 分区键表达式 | 决定分区裁剪能否生效 |
| total_rows | 行数估算 | 与 system.parts 的精确值可能有差异 |
| total_bytes | 压缩后占用 | 不含临时 part,与实际磁盘占用有差别 |
| create_table_query | 建表语句 | 含集群与副本路径,异地重建要改 |
total_rows 与 total_bytes 来自元数据估算,做容量核算或精确对账时要以 system.parts 的聚合结果为准,两者出现偏差是正常现象。
create_table_query 里包含 ON CLUSTER 与副本路径等集群相关信息,跨环境重建前必须修改集群名与宏路径,否则会指向不存在的集群,甚至因目标环境缺少同名宏而直接失败。