在以前的经验中,很多时候出现的性能问题都是由磁盘性能引起,很多时候我们总在吐槽存储性能太差,存储延时、吞吐达不到需求,而后在优化SQL中,首当其冲被抓出来的SQL 基本都是有全表扫描、索引全扫描执行计划的。
那么针对这个问题,是否有其他非优化SQL而能实现性能提升的办法呢,有的。
像Oracle有In memory,不过之前也没怎么去深入了解,这次正好在openGauss的8小时训练营学习中,有了较全面的了解的,在此简单做个总结。
MOT:简而言之就是内存表,也就是在MOT表里保存的数据在系统启动时都是直接加载到内存中。
其主要优点有:
高吞吐量:3倍于磁盘表,6倍于PG 12.2
低延迟:事务加速3倍至5.5倍
严格一致性保障的HA和RTO
openGausss在实现MOT上主要在下面这些点上做了针对性的优化:
1)内存优化数据结构
2)无锁事务管理
3)无锁索引
3)NUMA感知,事务本地内存
4)高效、可靠的持久化
5)查询本机编译(JIT)
事务管理
在内存管理上,openGauss分配了两块内存:
全局内存:所有CPU核心共享的长期内存,主要用于存储所有表数据和索引
本地内存:是短期的私有内存,主要用于在会话中处理事务,并将数据更改存储在本地内存中,直到提交阶段。
在事务处理上,openGauss将相关数据从全局内存复制到本地内存,待事务处理完成后再将这些数据从本地内存推回到全局内存,而在这个事务处理中是基于OCC的算法,以最小化降低在全局内存上的争用时间。
使用语法
创建一张MOT表也是非常简单的,我们只需要在创建普通表的语法上增加关键字 FOREIGN 就可以了。而其他操作就跟普通表一样对待就可以了。
创建MOT:
create FOREIGN table test(x int) [server mot_server];
查询:
select * from test;
性能
在基于TPC-C测试中,可以看到在事务率,延迟时间,MOT对比磁盘表以及其他数据库都有很大的性能提升。

而在初始启动时,MOT可在40秒内加载100 GB数据库检查点,实现极快速的初次启动。
关于openGauss的MOT大概就先介绍到这里了,更多特性和使用,小伙伴可以自己参考官方资料哦
https://opengauss.org/zh/docs/1.1.0/docs/DeveloperGuide/内存表特性.html




