Greenplum PostgreSQL订单表压缩应用位置排查求助
Greenplum order表大小异常排查(压缩位置确认)
1. 确认表的基础存储与压缩配置
先查询表的核心存储参数,明确是否启用压缩及压缩类型:
SELECT relname, relstorage, reloptions FROM pg_class WHERE relname = 'order';
relstorage字段:h代表堆表(堆表不支持压缩),a代表AO表,c代表CO表(AO/CO支持压缩)reloptions字段:若包含compresstype=zlib/zstd/quicklz、compresslevel等参数,说明表级已配置压缩;若有appendonly=true,则是AO/CO存储类型
2. 排查是否为分区表
如果是分区表,\dt+ order仅显示主表(空表)的大小,实际数据存储在子分区中:
先确认分区结构:
SELECT schemaname, tablename, partitiontype, partitionkey FROM pg_partitions WHERE tablename = 'order';
再查询所有子分区的实际大小:
SELECT quote_ident(schemaname) || '.' || quote_ident(tablename) AS partition_fullname, pg_size_pretty(pg_total_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename))) AS total_size, pg_size_pretty(pg_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename))) AS data_size FROM pg_tables WHERE tablename LIKE 'order_%'; -- 假设分区命名以order_前缀开头,可根据实际调整
3. 检查列级压缩配置(少数场景)
Greenplum主要支持表/分区级压缩,但部分版本支持列级压缩,可查询列的参数:
SELECT attname AS column_name, attoptions AS column_options FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'order') AND attnum > 0; -- 排除系统列
若某列的column_options包含压缩相关参数,说明该列单独配置了压缩
4. 验证数据分布与segment存储情况
由于表按order_id分布,需确认是否存在数据倾斜,或部分segment上无数据:
SELECT gp_segment_id, count(*) AS row_count, pg_size_pretty(pg_relation_size(relid)) AS segment_local_size FROM gp_dist_random('pg_class') WHERE relname = 'order' GROUP BY gp_segment_id, relid ORDER BY gp_segment_id;
该命令会展示每个segment上该表的本地数据量与大小,若大部分segment无数据,需检查分布键order_id的取值是否过于集中
内容的提问来源于stack exchange,提问作者msr
相关产品推荐
相关产品推荐

