MemSQL:使用COLUMNAR_SEGMENTS查询列存表空间是否含冗余?
理解
INFORMATION_SCHEMA.COLUMNAR_SEGMENTS的空间统计逻辑 针对你的问题,我会分两部分拆解这个视图的空间统计规则:
1. 统计的空间是否包含冗余?
INFORMATION_SCHEMA.COLUMNAR_SEGMENTS返回的COMPRESSED_SIZE和UNCOMPRESSED_SIZE不包含冗余数据,具体细节如下:
- 这两个字段统计的是单个节点上,列存表中每个数据段的实际存储大小:
UNCOMPRESSED_SIZE:数据段未压缩时的原始数据大小COMPRESSED_SIZE:数据段压缩后在磁盘上占用的实际物理空间
- 视图不会统计集群层面的副本冗余(比如多节点同步的副本数据),也不会包含表内的历史快照、已标记为删除但暂未被后台任务回收的废弃数据段——这类冗余数据不会出现在活跃的段统计结果里。
2. 分区结果是否包含冗余分区?
当你不执行SUM()聚合操作时,返回的每一行对应一个属于特定分区的列存段:
- 视图只会返回当前活跃、可用于查询服务的分区段,已经被标记为冗余/废弃的分区(比如过期归档的分区、已删除的分区副本)不会出现在查询结果中。
- 如果你需要进一步确认分区的有效性,可以结合
INFORMATION_SCHEMA.PARTITIONS视图,查看分区的状态字段(不同数据库字段名可能略有差异),验证哪些分区是当前活跃的。
对查询语句的小优化建议
你的当前查询里"" AS TOTAL_MEMORY_MB是一个空值列,如果你想统计内存中的缓存大小,部分数据库会在COLUMNAR_SEGMENTS里提供IN_MEMORY_SIZE字段,可以根据你的数据库类型调整这部分逻辑:
SELECT DATABASE_NAME AS DB, TABLE_NAME AS TABLE_NAME, SUM(IN_MEMORY_SIZE)/(1024*1024) AS TOTAL_MEMORY_MB, -- 若数据库支持该字段则启用 SUM(UNCOMPRESSED_SIZE)/(1024*1024) AS DISK_UNCOMP_MB, SUM(COMPRESSED_SIZE)/(1024*1024) AS DISK_COMP_MB FROM INFORMATION_SCHEMA.COLUMNAR_SEGMENTS WHERE TABLE_NAME = "table_name" GROUP BY DATABASE_NAME, TABLE_NAME;
内容的提问来源于stack exchange,提问作者Swathi Desai
相关产品推荐
相关产品推荐

