greenplum中heep表和AO表的基本概念和使用

greenplum中heep表和AO表的基本概念和使用

Greenplum 里真正存数据只有两种物理格式:Heap(堆表)AO(Append-Optimized,追加优化表,含行存 AO 与列存 AOCO)。下面用“一句话定义 + 一张对比表”把它们的核心概念、适用场景与优劣彻底分清。

一、基本概念

Heap 表

就是 PostgreSQL 原生的“堆”存储:数据行按插入顺序攒成页,UPDATE/DELETE 在原位置打标记,MVCC 旧版本留在原地,VACUUM 后期清理。

AO 表(Append-Optimized)

  • Greenplum 专属格式:只追加、不原地改。
    • orientation=row → AO 行存
    • orientation=column → AOCO 列存
      更新时把原行标记为“已删除”,新行追加到文件尾部;旧空间靠后台 VACUUM 压缩回收。

二、优劣速查表

维度 Heap AO(行存) AOCO(列存)
存储方式 堆页,原地更新 追加写行块 追加写列块
更新/删除 原生 MVCC,速度最快 标记删除+追加,性能下降 同左
单行 insert 慢(块级追加) 最慢
批量加载 COPY 中等 最快(直接写块) 最快
压缩 3-8× 节省 5-15× 节省
磁盘占用 最低
索引支持 所有(B-tree/GiST/GIN/Hash) 仅 B-tree/Bitmap 仅 B-tree/Bitmap
查询场景 高并发小 SQL、频繁更新 批量追加、大表扫描 宽表分析、只读报表
典型表 临时表、维表、日志表 事实表(行级) 事实表(列级)

三、总结

  • 1.小表、高并发、频繁更新 → Heap
  • 2.TB 级追加、批量 ETL、行级查询 → AO 行存
  • 3.宽表、列过滤多、要省盘、只读报表 → AOCO 列存

四、查看和创建

快速查看当前集群里哪些是 Heap / AO / AOCO

SELECT n.nspname,
       c.relname,
       CASE c.relstorage
            WHEN 'h' THEN 'heap'
            WHEN 'a' THEN 'ao'
            WHEN 'c' THEN 'aoco'
       END AS storage_type,
       pg_size_pretty(pg_relation_size(c.oid)) AS size
FROM   pg_class c
JOIN   pg_namespace n ON n.oid = c.relnamespace
WHERE  c.relkind = 'r'
  AND  n.nspname !~ '^pg_'
ORDER  BY 3, 4 DESC;


结果示例
 schema |   tablename   | storage_type |  size
--------+---------------+--------------+--------
 sales  | fact_order    | ao           | 120 GB
 sales  | fact_detail   | aoco         |  85 GB
 public | tmp_log       | heap         |  12 MB

创建语法(3 选 1)

1.Heap 表(默认,不写也行)

CREATE TABLE heap_demo (
    id   int PRIMARY KEY,
    val  text
) DISTRIBUTED BY (id);          -- or DISTRIBUTED RANDOMLY

2.AO 行存 + 压缩

CREATE TABLE ao_row_demo (
    id   bigint,
    data text
) WITH (appendonly=true,            -- 打开 AO
        compresstype=zstd,
        compresslevel=3,
        orientation=row)             -- 行存(默认)
  DISTRIBUTED BY (id);

3.AOCO 列存 + 分区 + 压缩

CREATE TABLE aoco_demo (
    dt   date,
    prod_id  int,
    amt      numeric(18,2)
) WITH (appendonly=true,
        orientation=column,         -- 列存
        compresstype=zstd,
        compresslevel=9)
  DISTRIBUTED BY (prod_id)
  PARTITION BY RANGE (dt)
  ( START ('2025-01-01') INCLUSIVE
    END ('2026-01-01') EXCLUSIVE
    EVERY (INTERVAL '1 month') );
posted @ 2026-03-19 14:22  数据库小白(专注)  阅读(2)  评论(0)    收藏  举报