OpenGauss 在存储过程、函数中,MOT表JOIN磁盘表

本文探讨了在PostgreSQL PL/pgSQL环境下,MOT表(内存对象表)与磁盘表的非官方JOIN操作。作者发现了一个可能的异常行为,通过实例展示了如何在存储过程和函数中实现这种连接,并提出了是否为功能误用或潜在bug的问题。

根据官网文档,MOT表是不支持JOIN磁盘表的,在gsql下执行也会报错,但是偶然发现,在pgplsql语句块里(包括存储过程和函数),MOT表可以JOIN磁盘表,不知这是个有用的功能还是个bug,复现操作如下:

create table emp1(
empno int primary key,
ename varchar(10),
job varchar(9),
deptno numeric(2));
INSERT INTO emp1 VALUES (1,'SMITH','CLERK',20); 
INSERT INTO emp1 VALUES (2,'ALLEN','SALESMAN',10); 
INSERT INTO emp1 VALUES (3,'WARD','SALESMAN',30); 

create foreign table emp1mot(
empno int primary key,
ename varchar(10),
job varchar(9),
deptno numeric(2));
INSERT INTO emp1mot VALUES (1,'SMITH','CLERK',60); 
INSERT INTO emp1mot VALUES (2,'ALLEN','SALESMAN',50); 
INSERT INTO emp1mot VALUES (3,'WARD','SALESMAN',40); 
INSERT INTO emp1mot VALUES (4,'JONES','MANAGER',30);
INSERT INTO emp1mot VALUES (5,'JONES','MANAGER',20);

CREATE OR REPLACE PROCEDURE proc1() 
AS
DECLARE
rec record;
BEGIN
for rec in (select * from emp1 e1 join emp1mot e1m on e1.deptno = e1m.deptno)
loop
RAISE NOTICE '%, %, %, %', rec."empno", rec."ename", rec."job", rec."deptno";
end loop;
END; 
/

call proc1()
 

### openGauss MOT 存储引擎概述 openGaussMOT (Memory-Optimized Table) 是一种高性能的内存优化存储引擎,它与传统的基于磁盘的存储引擎共同构成了 openGauss 数据库的核心组件之一[^1]。MOT 提供了一种全新的方式来管理和操作高度性能敏感的数据集,通过将这些数据加载到内存中实现极高的吞吐量和低延迟响应。 #### MOT 和传统存储引擎的区别 在 openGauss 架构中,存在两种主要类型的存储引擎:基于磁盘的传统存储引擎以及面向内存优化的 MOT 引擎[^3]。两者均依赖于统一的日志记录机制(Write-Ahead Logging, WAL),并通过共享相同的日志设备完成持久化操作。这种设计使得用户能够灵活选择适合其工作负载特性的存储方案,并享受一致的操作体验。 --- ### MOT 存储引擎的工作原理 MOT 的高效不仅仅来源于它的运行环境位于物理 RAM 中这一事实;更重要的是,该引擎针对现代多核处理器架构下的高并发场景做了深入优化[^4]。以下是几个关键方面: 1. **并发控制** - 动态锁管理器被重新定义以适应随机访问模式下频繁发生的事务冲突情况。 - 实现细粒度锁定策略减少等待时间提高整体效率。 2. **数据结构设计** - 高效索引技术如哈希或跳用于加速查找过程。 - 列式布局进一步增强了批量读取时 CPU 缓存命中率从而降低平均延时。 3. **垃圾回收机制** - 自动化的版本清理流程确保长期稳定运行期间不会因为旧版本残留而影响新请求处理速度。 4. **持久化保障** - 虽然大部分活动发生在易失性介质之上,但是借助写前日志(WAL),即使发生意外断电也能快速恢复至最近提交状态。 ```python # 示例代码展示如何创建一张 MOT CREATE TABLE mot_table ( id INT PRIMARY KEY, name VARCHAR(50), age SMALLINT ) USING mot; ``` 上述 SQL 语句展示了怎样声明一个使用 MOT 技术支撑的新关系型格实例。注意这里特别指定了 `USING mot` 关键字明此对象应由内存优化子系统负责维护而非默认文件系统映射路径上的常规方法论所管辖范围之内[^2]。 --- ### 使用指南 当决定采用 MOT 来承载某些特定业务逻辑单元之前,请务必考虑以下几个因素以便做出明智决策: - **成本效益分析**: 将热数据迁移到更昂贵但也更快捷的位置总是伴随着额外支出考量;因此只有那些真正需要亚毫秒级反应能力的任务才值得投入相应资源. - **容量规划**: 明确知晓当前硬件设施所能提供的最大可用RAM总量之后再分配给各个应用程序模块以免造成争抢现象进而拖累全局现. - **灾难恢复计划制定**: 即使有了完善的WAL保护措施仍需定期备份重要资料以防万一遭遇不可预见的重大事故导致原始副本丢失无法挽回损失. 最后提醒一点就是尽管理论上讲任何规模大小都可以尝试切换成全内存模式运作但实际上对于超大规模集群而言可能还需要更多定制开发才能达到理想效果所以建议从小试点项目起步逐步积累经验教训最终推广开来形成规模化效应. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值