暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OpenTenBase基础操作:不同类型表操作/查看元数据/分布式执行计划

原创 helenli 2025-06-19
434

实验环境

机器:阿里云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;


最后修改时间:2025-06-19 14:16:54
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论