实验环境
机器:阿里云ECS实例,2 核(vCPU)8 GiB,Ubuntu 22.04
数量:共使用了4台,其中3台共同构成2CN+3DN的集群节点,另一台作为部署主机,用于编译源码、分发二进制包等。
原因:起初使用阿里云2核4GB服务器,虽然在源码编译时没有出现问题,但是在集群搭建时会报错分配内存失败,因此调整了内存配置为8GB。
一、OpenTenBase源代码编译
见前置文章一:https://www.modb.pro/db/1935570972946477056
二、OpenTenBase集群搭建+初始化
见前置文章二:https://www.modb.pro/db/1935580585691459584
三、OpenTenBase基础操作
3.1 创建不同类型表
1. 创建分片表(普通分布式表)
连接CN主节点:psql -h 172.18.178.73 -p 30004 -d postgres -U opentenbase
创建节点组。
SQL -- 创建 default_group 并指定包含的 DataNode CREATE DEFAULT NODE GROUP default_group WITH (dn001, dn002, dn003);
-- 可选:创建分片组以关联分布式表 CREATE SHARDING GROUP TO GROUP default_group; |
执行建表语句,指定分布键和节点组。
SQL CREATE TABLE public.t1 ( f1 INT NOT NULL, f2 VARCHAR(20), PRIMARY KEY(f1) ) DISTRIBUTE BY SHARD(f1) TO GROUP default_group; |
验证表结构(\d+ public.t1),确认分布方式为SHARD(f1),存储节点为所有节点。

2. 创建分片分区表(分片+分区组合)
定义表结构并设置分区规则:
这里遇到了报错 ERROR: data type of start value MUST be timestamp. 将BEGIN ('2025-05-01 0:00:00') 修改为BEGIN (TIMESTAMP '2025-05-01 0:00:00') 后解决。
SQL CREATE TABLE public.t1_pt ( f1 INT NOT NULL, f2 TIMESTAMP NOT NULL, f3 VARCHAR(20), PRIMARY KEY(f1) ) PARTITION BY RANGE(f2) BEGIN (TIMESTAMP '2025-05-01 0:00:00') STEP (INTERVAL '1 MONTH') PARTITIONS (2) DISTRIBUTE BY SHARD(f1) TO GROUP default_group; |
验证分区信息(\d+ public.t1_pt),确认分区数、起始时间及分布键。

3. 创建复制表(全节点同步数据)
执行建表语句,指定REPLICATION分布方式:
SQL CREATE TABLE public.t1_rep ( f1 INT NOT NULL, f2 VARCHAR(20), PRIMARY KEY(f1) ) DISTRIBUTE BY REPLICATION TO GROUP default_group; |
确认表结构(\d+ public.t1_rep),分布方式为REPLICATION,存储于所有节点。

4. 创建单表(仅存储于单个节点)
重新初始化集群,创建新节点组(default_group含dn001, dn002,single_group含dn003):
SQL CREATE DEFAULT NODE GROUP default_group WITH (dn001, dn002); CREATE NODE GROUP single_group WITH (dn003); |
建表时指定单节点组:
SQL CREATE TABLE public.t1_single ( f1 INT NOT NULL, f2 VARCHAR(20), PRIMARY KEY(f1) ) DISTRIBUTE BY REPLICATION TO GROUP single_group; |

单表创建失败解决方案:
问题:初始default_group包含所有节点,无法创建单表。
步骤:
执行pgxc_ctl clean all清空集群。
重新初始化集群,创建default_group(含dn001, dn002)和single_group(含dn003)。
按单节点组创建表。
3.2 查看元数据
查看表结构详情:
SQL \d+ public.t1; -- 查看列定义、索引、分布方式 |
查询集群节点分布:
SQL SELECT * FROM pgxc_node; -- 查看节点ID、类型、IP等信息 SELECT * FROM pgxc_group; -- 查看节点组配置 |

3.3 查看分布式执行计划
1. 插入操作
向分片表插入数据:
SQL INSERT INTO t1 VALUES(1, 'opentenbase'), (2, 'pg'); |
查看执行计划(EXPLAIN INSERT INTO t1 VALUES(1, 'a'), (2, 'b');),确认通过Remote Subquery Scan按分布键分片插入。

2. 更新操作:不同条件对比
基于分布键更新: 执行计划显示定位到dn003节点,通过索引扫描更新
SQL EXPLAIN UPDATE t1 SET f2='opentenbase' WHERE f1=1; |

非分布键更新: 执行计划显示广播到所有节点(dn001, dn002,dn003),全表扫描
SQL EXPLAIN UPDATE t1 SET f2='opentenbase' WHERE f2='pg'; |

分区表带分区条件更新: 定位到分区子表t1_pt_part_0,减少扫描范围
SQL EXPLAIN UPDATE t1_pt SET f3='opentenbase' WHERE f1=1 AND f2>'2025-05-01' AND f2<'2025-06-01'; |

3. 删除操作
执行删除并返回记录:
SQL DELETE FROM t1 WHERE f1=2 RETURNING *; -- 输出被删除的记录:f1=2, f2=pg |

4. 查询操作:效率对比
分布键查询: 定位到dn003节点,通过索引快速查询

SQL EXPLAIN SELECT * FROM t1_update WHERE f1=1; |
非分布键查询: 扫描所有节点(dn001, dn002),全表过滤

SQL EXPLAIN SELECT * FROM t1_update WHERE f1 <3; |