GreenPlum教程FG030-GreenPlum大表分区设计实战
本文档风哥主要介绍GreenPlum大表分区设计,包括大表分区概念、分区类型、大表分区最佳实践、范围分区、列表分区、大表分区案例等内容,风哥教程参考GreenPlum官方文档Administrator Guide、Table Partitioning等内容编写,适合DBA人员在学习和测试中使用。
Part01-基础概念与理论知识
1.1 GreenPlum大表分区概念
大表分区是将大表按照一定规则拆分成多个小表的技术,可以提高查询性能和管理效率。更多视频教程www.fgedu.net.cn
1.1.1 分区优势
1. 查询性能提升
– 分区裁剪
– 减少扫描数据量
– 提高查询速度
– 优化查询计划
2. 管理便利
– 分区独立管理
– 快速删除历史数据
– 分区级别备份
– 分区级别维护
3. 数据加载优化
– 分区并行加载
– 减少索引维护
– 提高加载速度
– 降低锁竞争
4. 存储优化
– 分区级别压缩
– 冷热数据分离
– 存储分层管理
– 降低存储成本
1.2 GreenPlum分区类型
GreenPlum支持多种分区类型,适用于不同的业务场景。学习交流加群风哥微信: itpux-com
1.2.1 分区类型
1. 范围分区(Range Partition)
– 按数值范围分区
– 按日期范围分区
– 最常用的分区方式
– 适合时间序列数据
2. 列表分区(List Partition)
– 按枚举值分区
– 按地区分区
– 按类别分区
– 适合离散值数据
3. 组合分区
– 范围+列表组合
– 多级分区
– 复杂业务场景
– 灵活性高
4. 默认分区
– 处理未匹配数据
– 数据完整性保证
– 避免数据丢失
– 灵活扩展
Part02-生产环境规划与建议
2.1 GreenPlum大表分区最佳实践
- 选择合适的分区键
- 合理设置分区粒度
- 定期维护分区
- 监控分区性能
- 建立分区管理流程
Part03-生产环境项目实施方案
3.1 GreenPlum范围分区实战
3.1.1 创建范围分区表
$ psql -d fgedudb -U fgedu
psql (9.4.26)
Type “help” for help.
fgedudb=>
# 创建按日期范围分区的表
fgedudb=> CREATE TABLE fgedu.fgedu_sales_partition (
fgedudb(> sale_id BIGINT,
fgedudb(> sale_date DATE,
fgedudb(> customer_id INT,
fgedudb(> product_id INT,
fgedudb(> quantity INT,
fgedudb(> amount NUMERIC(18,2)
fgedudb(> ) DISTRIBUTED BY (sale_id)
fgedudb-> PARTITION BY RANGE (sale_date)
fgedudb-> (
fgedudb(> PARTITION p202601 START (‘2026-01-01’) END (‘2026-02-01’),
fgedudb(> PARTITION p202602 START (‘2026-02-01’) END (‘2026-03-01’),
fgedudb(> PARTITION p202603 START (‘2026-03-01’) END (‘2026-04-01’),
fgedudb(> PARTITION p202604 START (‘2026-04-01’) END (‘2026-05-01’),
fgedudb(> DEFAULT PARTITION other
fgedudb(> );
CREATE TABLE
# 查看分区信息
fgedudb=> SELECT
fgedudb-> tablename,
fgedudb-> partitionname,
fgedudb-> partitiontype,
fgedudb-> partitionlevel
fgedudb-> FROM pg_partitions
fgedudb-> WHERE tablename = ‘fgedu_sales_partition’;
tablename | partitionname | partitiontype | partitionlevel
——————–+—————+—————+—————-
fgedu_sales_partition | p202601 | range | 0
fgedu_sales_partition | p202602 | range | 0
fgedu_sales_partition | p202603 | range | 0
fgedu_sales_partition | p202604 | range | 0
fgedu_sales_partition | other | range | 0
(5 rows)
学习交流加群风哥QQ113257174
3.1.2 分区管理操作
fgedudb=> ALTER TABLE fgedu.fgedu_sales_partition
fgedudb-> ADD PARTITION p202605 START (‘2026-05-01’) END (‘2026-06-01’);
ALTER TABLE
# 删除分区
fgedudb=> ALTER TABLE fgedu.fgedu_sales_partition
fgedudb-> DROP PARTITION p202601;
ALTER TABLE
# 清空分区数据
fgedudb=> TRUNCATE TABLE fgedu.fgedu_sales_partition_1_prt_p202602;
TRUNCATE TABLE
# 分区裁剪测试
fgedudb=> EXPLAIN SELECT * FROM fgedu.fgedu_sales_partition
fgedudb-> WHERE sale_date BETWEEN ‘2026-03-01’ AND ‘2026-03-31’;
QUERY PLAN
———————————————————————————–
Gather Motion 2:1 (slice1; segments: 2) (cost=0.00..100.00 rows=1000 width=100)
-> Seq Scan on fgedu_sales_partition_1_prt_p202603 (cost=0.00..100.00 rows=1000 width=100)
Filter: ((sale_date >= ‘2026-03-01’::date) AND (sale_date <= '2026-03-31'::date))
(3 rows)
# 可以看到只扫描了p202603分区
更多学习教程公众号风哥教程itpux_com
3.2 GreenPlum列表分区实战
3.2.1 创建列表分区表
fgedudb=> CREATE TABLE fgedu.fgedu_order_region (
fgedudb(> order_id BIGINT,
fgedudb(> order_date DATE,
fgedudb(> region VARCHAR(50),
fgedudb(> customer_id INT,
fgedudb(> amount NUMERIC(18,2)
fgedudb(> ) DISTRIBUTED BY (order_id)
fgedudb-> PARTITION BY LIST (region)
fgedudb-> (
fgedudb(> PARTITION p_beijing VALUES (‘北京’),
fgedudb(> PARTITION p_shanghai VALUES (‘上海’),
fgedudb(> PARTITION p_guangzhou VALUES (‘广州’),
fgedudb(> PARTITION p_shenzhen VALUES (‘深圳’),
fgedudb(> DEFAULT PARTITION p_other
fgedudb(> );
CREATE TABLE
# 插入测试数据
fgedudb=> INSERT INTO fgedu.fgedu_order_region VALUES
fgedudb-> (1, ‘2026-04-01’, ‘北京’, 1001, 1000.00),
fgedudb-> (2, ‘2026-04-01’, ‘上海’, 1002, 2000.00),
fgedudb-> (3, ‘2026-04-01’, ‘广州’, 1003, 3000.00),
fgedudb-> (4, ‘2026-04-01’, ‘深圳’, 1004, 4000.00);
INSERT 0 4
# 查询特定分区
fgedudb=> SELECT * FROM fgedu.fgedu_order_region WHERE region = ‘北京’;
order_id | order_date | region | customer_id | amount
———-+————+——–+————-+———
1 | 2026-04-01 | 北京 | 1001 | 1000.00
(1 row)
from GreenPlum视频:www.itpux.com
Part04-生产案例与实战讲解
4.1 GreenPlum大表分区案例
4.1.1 日志表分区案例
# 1. 创建按天分区的日志表
CREATE TABLE fgedu.fgedu_log_partition (
log_id BIGSERIAL,
log_time TIMESTAMP,
log_level VARCHAR(20),
log_module VARCHAR(100),
log_message TEXT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) DISTRIBUTED BY (log_id)
PARTITION BY RANGE (log_time)
(
PARTITION p20260401 START (‘2026-04-01 00:00:00’) END (‘2026-04-02 00:00:00’),
PARTITION p20260402 START (‘2026-04-02 00:00:00’) END (‘2026-04-03 00:00:00’),
PARTITION p20260403 START (‘2026-04-03 00:00:00’) END (‘2026-04-04 00:00:00’),
DEFAULT PARTITION p_other
);
# 2. 自动添加分区脚本
$ cat > /GreenPlum/scripts/add_partition.sh << 'EOF'
#!/bin/bash
# add_partition.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
NEXT_DATE=$(date -d "+1 day" +%Y-%m-%d)
NEXT_DATE_END=$(date -d "+2 day" +%Y-%m-%d)
PARTITION_NAME="p$(date -d "+1 day" +%Y%m%d)"
psql -d fgedudb -U fgedu << SQL
ALTER TABLE fgedu.fgedu_log_partition
ADD PARTITION ${PARTITION_NAME}
START ('${NEXT_DATE} 00:00:00') END ('${NEXT_DATE_END} 00:00:00');
SQL
EOF
# 3. 配置定时任务(每天执行)
$ crontab -e
0 0 * * * /GreenPlum/scripts/add_partition.sh
# 4. 删除旧分区(保留90天)
$ cat > /GreenPlum/scripts/drop_old_partition.sh << 'EOF'
#!/bin/bash
OLD_DATE=$(date -d "-90 day" +%Y%m%d)
PARTITION_NAME="p${OLD_DATE}"
psql -d fgedudb -U fgedu << SQL
ALTER TABLE fgedu.fgedu_log_partition DROP PARTITION ${PARTITION_NAME};
SQL
EOF
# 5. 配置定时任务(每天执行)
$ crontab -e
0 1 * * * /GreenPlum/scripts/drop_old_partition.sh
Part05-风哥经验总结与分享
5.1 GreenPlum大表分区技巧
1. 分区键选择
– 选择查询常用字段
– 选择数据分布均匀的字段
– 选择有明确范围的字段
– 避免选择更新频繁的字段
2. 分区粒度
– 根据数据量确定
– 日志表:按天分区
– 订单表:按月分区
– 历史表:按年分区
3. 分区维护
– 定期添加新分区
– 定期删除旧分区
– 监控分区数据量
– 优化分区性能
4. 性能优化
– 利用分区裁剪
– 建立合适的索引
– 更新统计信息
– 监控查询性能
5. 最佳实践
– 建立分区管理流程
– 自动化分区维护
– 监控分区性能
– 定期优化调整
本文档介绍了GreenPlum大表分区设计的核心内容,包括范围分区、列表分区、大表分区案例等,希望对大家有所帮助。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
