如何通过SQL查询ClickHouse中S3等磁盘的存储空间占用情况
问题原因说明
- 查询
system.disks得到S3磁盘已用空间为0:S3属于远程对象存储,ClickHouse默认不会主动扫描统计远程存储的总空间与空闲空间,因此该表返回的S3相关空间计算结果不符合实际。 - 查询
system.tables无法关联磁盘:该表仅统计单表总大小,没有存储磁盘的关联字段,无法匹配数据存储位置。
正确查询方案
ClickHouse的system.parts系统表存储了所有MergeTree系列表的分区明细,包含disk_name(数据所在磁盘名)字段,是实现需求的核心查询表。
1. 查询所有磁盘的存储空间占用
SELECT disk_name, sum(data_compressed_bytes) / pow(10,9) AS compressed_used_Gb, sum(data_uncompressed_bytes) / pow(10,9) AS uncompressed_used_Gb, count(DISTINCT concat(database, '.', table)) AS table_num FROM system.parts WHERE active = 1 GROUP BY disk_name ORDER BY compressed_used_Gb DESC;
说明:该查询统计所有活跃分区的实际占用,支持本地磁盘、S3等所有类型的存储盘,结果准确
2. 查询单表对应磁盘的存储占用
SELECT database, table, disk_name, sum(data_compressed_bytes) / pow(10,9) AS compressed_used_Gb FROM system.parts WHERE active = 1 -- 可取消下方注释筛选指定库 -- AND database IN ('default', 'test') GROUP BY database, table, disk_name ORDER BY database, table, compressed_used_Gb DESC;
说明:如果表配置了分层存储策略,数据分散在多个磁盘上,该查询也能展示同一张表在不同磁盘的空间分布
内容的提问来源于stack exchange,提问作者Pierre Louis
相关产品推荐
相关产品推荐

