Greenplum MPP 分析数据库

FreeGuideOnline 最新 2026-07-09

sql -- 哈希分布表 CREATE TABLE sales ( sale_id int, product_id int, amount decimal ) DISTRIBUTED BY (sale_id);

-- 复制表 CREATE TABLE products ( product_id int, name text ) DISTRIBUTED REPLICATED;


## 快速部署 Greenplum 环境
初学者可通过 Docker 快速搭建单节点 Greenplum,体验完整功能。

### 使用 Docker 启动
```bash
docker run -d --name gpdb \
  -p 5432:5432 \
  -e POSTGRES_PASSWORD=changeme \
  greenplumdb/gpdb:latest

国内镜像:

docker pull registry.cn-hangzhou.aliyuncs.com/greenplum/gpdb:7.0.0

连接数据库:

docker exec -it gpdb psql -U gpadmin postgres

本地安装(CentOS 示例)

官方提供 RPM 包,安装后需初始化集群:

sudo yum install -y greenplum-db-7.0.0-*.rpm
source /usr/local/greenplum-db/greenplum_path.sh
gpssh-exkeys -f hostfile_exkeys   # 配置节点互信
gpinitsystem -c gpinitsystem_config   # 初始化集群

核心数据库操作

所有标准 SQL 在 Greenplum 中均可直接使用,同时提供大量扩展函数。

表分区与存储优化

分区表将数据按范围或列表划分,可结合分布键进一步提升查询效率。

CREATE TABLE sales_part (
    sale_id int,
    sale_date date,
    amount decimal
) DISTRIBUTED BY (sale_id)
PARTITION BY RANGE (sale_date)
(
    PARTITION jan2024 START ('2024-01-01') END ('2024-02-01'),
    PARTITION feb2024 START ('2024-02-01') END ('2024-03-01')
);

常用存储模型:

  • 堆表(Heap):默认存储,适合更新和删除操作。
  • AO 表(Append-Optimized):适合批量追加写入,支持列存压缩。
-- 列存 AO 表
CREATE TABLE fact_sales (
    ... 
) WITH (appendonly=true, orientation=column, compresstype=zstd);

数据加载最佳方式

Greenplum 推荐使用 gpfdistCOPY 命令批量导入数据,避免逐行 INSERT 带来的性能问题。

外部表方式(基于 gpfdist):

CREATE EXTERNAL TABLE ext_sales (
    sale_id int, amount decimal
) LOCATION ('gpfdist://datahost:8080/sales.csv')
FORMAT 'CSV' (HEADER);
INSERT INTO sales SELECT * FROM ext_sales;

简单快速加载:

COPY sales FROM '/data/sales.csv' WITH CSV HEADER;

查询性能调优

正确编写 SQL 和合理设计表结构是发挥 MPP 性能的关键。

查看执行计划

EXPLAIN SELECT ...;
EXPLAIN ANALYZE SELECT ...;   -- 实际执行并显示统计

关注计划中的 Motion 节点,它代表数据在 Segment 间的重分布,开销较大。通过调整分布键减少 Motion 可大幅优化连接性能。

连接优化技巧

  • 将大表的连接键设为分布键,使同键值数据落在同一 Segment,避免重分布 Motion。
  • 小表使用复制表,连接时无需网络传输。
  • 对聚合查询指定 GROUP BY 分布键,可实现本地聚合。
-- 两表 distribution key 同为 user_id
SELECT ... FROM users JOIN orders ON users.user_id = orders.user_id;

资源队列管理

避免并发查询抢占资源,通过资源队列控制内存和并发度。

CREATE RESOURCE QUEUE adhoc WITH (ACTIVE_STATEMENTS=5);
ALTER ROLE analyst RESOURCE QUEUE adhoc;

常用工具与生态

  • gpcc(Command Center):官方 Web 监控工具,可查看查询概要、节点状态。
  • gpfdist:并行数据加载服务。
  • gpload:基于 YAML 的批量加载调度工具。
  • Apache Madlib:库内机器学习库,支持 SQL 接口。
  • PXF(Platform Extension Framework):无缝访问 Hadoop、S3 等外部数据源。

日常运维命令速查

gpstate -s                # 显示集群状态
gpconfig -c max_connections -v 100  # 修改参数
gpstop -u                # 重新加载配置(不停机)
vacuumdb --all --analyze  # 全库统计信息更新