GaussDB Ustore存储引擎解读
目录
一、数据库存储引擎
二、GaussDB Ustore存储引擎
总结
本文将介绍GaussDB中的Ustore存储引擎,包括Ustore的设计背景、特点介绍和适用业务场景等。
一、数据库存储引擎
数据库的存储引擎负责在内存和磁盘上存储、检索和管理数据,确保每个节点的数据能够长久保存。
存储引擎主要分为行存储(Row-Store)和列存储(Column-Store)两种方式。其中,行存储主要适合于在线交易型的OLTP场景;而列存储主要用于海量静态数据的分析,一般应用于OLAP场景。
二、GaussDB Ustore存储引擎
1. 背景介绍
在Ustore存储引擎出现之前,GaussDB的行存储引擎是Astore。Astore引擎采用了优化的Append Update(追加更新)存储格式设计,其元组(数据)的存储方式如图1所示。

图1 Astore引擎元组(数据)的存储方式
当一个更新操作将 v0 版本元组更新为v1 版本元组后,如果 v0 元组所在页面有空闲空间,则直接在该页面内插入更新后的v1元组,并将v0的元组指针指向v1的元组指针。在此过程中,新版本元组以追加写的方式和被更新的老版本元组混合存放,从而可以减少更新操作的I/O开销。
Astore在处理业务中的插入、删除及Hot-Update(同一页面内的更新)场景时表现出色。然而,对于跨数据页面更新的非Hot-Update场景,新数据需插入到新的页面,并插入新的索引,这不仅会引入额外的I/O操作,还可能导致索引膨胀。
由于新旧版本元组混合存放,需要通过vacuum操作遍历表数据并清理其中的死元组。vacuum操作不仅会占用一定系统资源,且在清理时需要对页面加写锁,读写锁的冲突也会影响用户的读写业务。因此,如果频繁vacuum操作可能会导致性能问题;反之,但如果vacuum操作频率太低,清理元组不及时,又会导致存储空间膨胀。
可以看出,Astore更适用于插入较多而更新较少的业务场景。为了应对频繁更新的业务场景,Ustore存储引擎应运而生。Ustore也是行存储引擎,又名In-place Update(原地更新)存储引擎,特别适用于频繁更新的业务场景。
2.核心目标
Ustore存储引擎的核心目标为:
第一,针对OLTP场景,降低Append-Update存储引擎由于频繁更新导致的数据页空间膨胀,以及由此引起的索引空间膨胀。
第二,去除vacuum依赖,vacumm不再清理ustore的页面,从而减少大量页面I/O操作,节省系统资源,同时避免因vacuum操作引起的性能波动。
3.原理介绍
In-place Update
Ustore存储引擎将新旧版本的数据分开存储,最新版本的数据被存储在数据页上,并且单独开辟一段Undo空间,专门用来统一管理历史版本的旧数据。因此,数据空间不会由于频繁更新而膨胀,旧版本的垃圾数据回收效率也会更高。

图2 Ustore的原地更新操作
Ustore的原地更新操作,如图2所示,当对数据页上的Tuple(元组)进行更新时,系统会将页面上的旧版本Tuple采用追加写的方式写入到Undo空间,这样旧版本数据的读取和写入不会发生冲突,同时在数据页上对Tuple的位置进行原地更新;当需要查询旧版本数据时,系统会检查TD(事务目录),然后从Undo空间中取出旧版本数据。
Ustore的原地更新机制保证了元组RowId稳定,对于在多个事务并发更新同一行的场景,更新时延相对稳定。同时,由于数据的最新版本和历史版本被分离存储,历史版本的批量回收不影响数据页的读写操作,因此,对最新版本的堆表数据空间膨胀友好。
多版本索引
Ustore实现了多版本索引Ubtree,Ubtree叶子节点的页面结构如图3所示。

图3 Ubtree叶子节点的页面结构
Ubtree的叶子结点中,每个索引元组的尾部附加了对应的xmin和xmax(插入和删除的事务ID)。通过检查xmin和xmax,可以判断这个索引元组是否对当前事务可见,这种机制允许进行独立的多版本并发控制(MVCC)。索引可见性检查使得Index Scan和IndexOnly Scan的性能有所提升,还增加了IndexOnly Scan的比例,大大减少回表操作的次数。
空间管理和回收
Ustore不依赖vacuum清理机制,实现了自治式的空间管理机制,堆表和索引的空间分配和回收都在业务运行的时候平稳进行,可以减少由于vacuum异步数据清理带来的大量页面I/O。
当页面上的数据元组被删除时,系统会在页面上记录对应的潜在空闲空间(Potential Free Space),用于估计页面上的空闲空间。在执行DML语句时,如果发现空间不足或者潜在空闲空间达到某个阈值,会尝试对页面进行清理。在执行DQL查询语句时,若检测到页面上潜在空闲空间达到阈值,此时会尝试申请页面的写锁,一旦拿到了页面的写锁,同样会尝试对页面进行清理。
对于那些一直不被访问的页面,也可能存在可清理的元组。清理这些元组的机制如下:
当DML业务通过FSM(Free Space Map,自由空间映射)发现没有足够的可用空间,并且在对堆表的物理文件进行扩展前,会随机选取一些页面进行清理。经过多次尝试后,选取的页面会覆盖整个表的全部页面。
支持NUMA-aware
Ustore采用了NUMA-aware(非统一内存访问感知)的Undo子系统设计,这使得Undo子系统可以在多核平台上实现有效扩展。Undo空间被划分为多个逻辑区域(UndoZone) ,线程会在自己的逻辑区域上进行分配,确保与其他线程完全隔离,从而写入旧数据分配空间时就不会有额外的锁开销。同时,UndoZone可以按照CPU的NUMA核进行划分,每个线程会从当前的NUMA核上的UndoZone进行分配,进一步提升分配效率。
4. Ustore闪回功能介绍
数据备份恢复是保护数据安全的重要手段之一。备份恢复类型一般可以分为物理恢复、逻辑恢复、闪回恢复。
物理恢复是通过物理文件拷贝的方式来备份数据库,通过备份的数据文件和归档日志(Redo Log),可以完全恢复数据库。这种恢复方式一般用于全量备份,能够恢复整个数据库到备份时的状态。
逻辑恢复是通过逻辑导出操作对数据库进行备份,但只能恢复到备份时保存的数据状态,无法恢复到具体某个时间点。由于逻辑恢复需要重建数据库并导入备份数据,因此,需要恢复的时间太长,这种恢复方式通常会用于数据迁移场景。
闪回恢复也是数据库恢复技术的一种,如图4所示。它可以有选择性地高效撤销一个已提交事务的影响,将数据从人为的不正确的操作中恢复出来。闪回恢复具有高效、可靠、精确的特点,通过恢复操作使得数据表可以回溯到某个历史状态,而不需要还原整个数据库。

图4 闪回恢复,快速回溯到历史状态
Ustore提供了闪回查询、闪回表、闪回Drop、闪回Truncate四类闪回功能,对于误操作数据后恢复十分有效。
闪回查询和闪回表
闪回查询:基于MVCC机制,定时捕获并存储快照作为闪回点,并且保留一定期限内的元组旧版本。通过使用保存的闪回点快照,可以检索出指定的旧版本数据,可以查询某个表在过去某个时间点的快照数据。这一特性可以用于查看和逻辑重建因意外删除或更改而受损的数据。
闪回表:基于MVCC机制,通过删除指定时间点和该时间点之后的增量数据,可以将表恢复至特定时间点,实现表级的数据还原。当逻辑损坏仅限于一个或一组表,而非整个数据库时,此特性可以快速恢复表的数据。
闪回Drop/Truncate
闪回Drop和闪回Truncate都是基于回收站(Recycle Bin)机制实现的,这一机制类似于windows系统的回收站,将已删除的表信息保存到回收站中,通过还原回收站中记录的表的物理文件,实现已Drop/Truncate表的恢复。
-
闪回Drop:可以恢复因意外而被删除的表,从回收站中恢复被删除的表及其附属结构,如索引、表约束等。
-
闪回Truncate:可以恢复因误操作或意外而被进行Truncate的表,从回收站中恢复被Truncate的表及索引的物理数据。
采用闪回技术后,恢复已提交的数据库修改前的数据只需要秒级,而且恢复时间和数据库大小无关,可以快速有效的进行数据恢复。
5.核心优势
1)高性能
对插入、更新、删除等不同负载的业务,系统可以做到性能和资源使用表现相对均衡,相比Append Update 引擎性能提升10%。
对于更新操作,由于采用原地更新策略,系统在频繁更新类的业务场景下,拥有更高、更平稳的性能表现。
通过DML操作中执行动态页面清理,系统成功去除对Vacuum依赖,减少由于异步数据清理而产生的大量读写I/O操作,适合事务短、更新频繁、性能要求高的OLTP类业务场景。
2)高效存储
支持原地更新机制,通过将数据页面和回滚段分离存储,具备更高效、平稳的I/O处理能力,TPCC负载平均节约空间15%~20%。
Undo空间采用统一分配,集中回收的方式,复用效率更高,使得存储空间使用更加高效、平稳。
3)细粒度资源控制
通过Undo子系统,实现事务级的空间管控,可基于事务运行时长、单事务使用Undo空间大小以及整体Undo空间限制等方式监管事务运行,防止异常行为出现,方便数据库管理员对数据库系统资源使用进行规范和约束。
总结
GaussDB的Ustore存储引擎在数据频繁更新场景下,依旧保持性能平稳,抖动范围缩减了81%,因此,适应更多业务场景和工作负载;同时,还支持闪回功能,可以恢复因误操作而丢失的数据,这使得Ustore存储引擎更适用于对性能和稳定性有更高要求的金融核心业务场景。
相关文章:
GaussDB Ustore存储引擎解读
目录 一、数据库存储引擎 二、GaussDB Ustore存储引擎 总结 本文将介绍GaussDB中的Ustore存储引擎,包括Ustore的设计背景、特点介绍和适用业务场景等。 一、数据库存储引擎 数据库的存储引擎负责在内存和磁盘上存储、检索和管理数据,确保每个节点的…...
JAVA基础:数组 (习题笔记)
一,编码题 1,数组查找操作:定义一个长度为10 的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组是否包含有这个单词,包含这个单词就打印出“Yes”&…...
VMWARE ESXI VMFS阵列故障 服务器数据恢复
1:河南用户一台DELL R740 3块2.4T硬盘组的RAID5,早期坏了一个盘没有及时更换,这次又坏了一个,导致整组RAID5处于数据丢失的状态, 2:该服务器装的是VMware ESXI 6.7,用户把3块硬盘寄过来进行数据…...
实时金融股票数据API接口websocket接入方法
一、使用websocket的协议提升传输速度 实时金融股票数据对于投资者和交易员来说至关重要。通过使用WebSocket接入方法,可以轻松获取实时金融股票类数据并及时做出决策。WebSocket是一种高效的双向通信协议,它允许数据的实时推送,避免了不断的…...
机器学习与成像技术
机器学习与成像技术 在科技日新月异的今天,机器学习与成像技术的结合正引领着智能视觉领域进入一个全新的发展阶段。这一结合不仅推动了图像识别、目标检测、视频分析等领域的快速发展,还深刻影响着医疗、安防、自动驾驶等多个行业。本文将从机器学习与…...
【系统架构设计师】预测试卷一:综合知识(75道选择题)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5~6题】【第7题】【第8~10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17~18题】【第19~20题】【第21~22题】【第23~24题】【第25~26题】【第2…...
【addRepository 在tomcat 8和tomcat 9的支持情况】
项目中涉及将远程下载的 jar包进行解密后加载到 tomcat 容器中。 File jarFile new File(fileUrl); String jarFileUrl jarFile.toURI().toURL().toString(); WebappClassLoader webLoader (WebappClassLoader) classLoader; webLoader.addRepository(jarFileUrl);在升级到 …...
2024网鼎杯web1+re2 wp
这两道题属于比较简单的,顺道说一下,今年的题有点抽象,web不是misc,re不是web的,也有可能时代在进步,现在要求全栈✌了吧 web1 最开始被强网的小浣熊带偏思路了,进来疯狂找sql注入,…...
Python 自动化运维:安全与合规最佳实践
Python 自动化运维:安全与合规最佳实践 目录 🔒 Python安全编程实践与最佳实践🔑 使用Hashlib与Cryptography进行数据加密📊 安全审计与合规检查的重要性🔍 处理敏感数据与隐私保护的方法 1. 🔒 Python安…...
I2S、PDM、PCM、TDM、DSM、DCODEC、VAD、SPDIF
I2S (Inter-IC Sound) 用途: 一种用于芯片之间传输音频数据的串行总线标准。特点: 常用于高质量音频设备,如DAC、ADC和音频编解码器。I2S主要传输PCM格式的音频数据。PDM (Pulse Density Modulation) 用途: 主要用于数字麦克风等设备,以简化硬件接口。特点: 使用脉冲密度来编…...
关于我的编程语言——C/C++——第四篇(深入1)
(叠甲:如有侵权请联系,内容都是自己学习的总结,一定不全面,仅当互相交流(轻点骂)我也只是站在巨人肩膀上的一个小卡拉米,已老实,求放过) 字符类型介绍 char…...
2025年上半年软考高级科目有哪些?附选科指南
新手在准备报考软考时,都会遇到这样的一个问题——科目这么多,我适合考什么?2025上半年软考高级有哪些科目可以报考?要想知道自己适合报什么科目,就需要了解每个科目是什么,考什么等一系列的问题࿰…...
线上查企业该用哪家平台?
在销售领域,经常会遇到电话接通率低的问题。这可能是因为许多电话号码来源于某些商业信息平台,这些号码可能已经被代账公司使用,或者已经被同行业多次联系过,导致接通率不高。为了解决这一问题,可以采用数据过滤服务&a…...
Metrix:实现CI服务器上的DORA指标自动化计算
本文还有配套的精品资源,点击获取 简介:Metrix项目是一个Go语言编写的工具,旨在自动化计算DevOps效能的关键指标——DORA指标,这些指标包括部署频率、前置时间、平均恢复时间和变更失败率。它通过集成到CI服务器如Jenkins或GitH…...
【STL_list 模拟】——打造属于自己的高效链表容器
一、list节点 list是一个双向循环带头的链表,所以链表节点结构如下: template<class T>struct ListNode{T val;ListNode* next;ListNode* prve;ListNode(int x){val x;next prve this;}};二、list迭代器 2.1、list迭代器与vector迭代器区别…...
Java 基础教学:高级特性与实战-集合框架
Java 集合框架提供了一套性能优良、使用方便的接口和类,用于存储和操作群组数据。最常用的集合接口有 List、Set 和 Map。 List List 接口可以存储一系列有序的元素,并且可以包含重复的元素。List 的实现类常用的有 ArrayList 和 LinkedList。 ArrayL…...
单片机原理及应用笔记:C51数组与项目实践
作者介绍 刘滋瑞,男,银川科技学院计算机与人工智能学院,2022级计算机与科学技术8班本科生,单片机原理及应用课程第九组。 指导老师:王兴泽 电子邮箱:602054774qq.com 前言 本篇文章是参考《单片机原理…...
综合项目--博客
一。基础配置: 1.配置主机名,静态IP地址 2.开启防火墙配置 3.部分开启selinux并且配置 4.服务器之间使用同ntp.aliyun.com进行世家能同步 5.服务器之间实现SSH绵密登陆 二。业务需求 1.Sever-NFS-DNS主机配置NFS服务器,将博客网站资源…...
ARM64的Mac Node.js前置工作,nvm在线安装
1,通过 终端 ping raw.githubusercontent.com 获取到ip地址185.199.110.133 2,终端输入sudo vi /etc/hosts,打开hosts文件 3,在最后添加 185.199.110.133 raw.githubusercontent.com 保存后退出 3.1,清除环境 完全…...
C++《list的模拟实现》
在上一篇C《list》专题当中我们了解了STL当中list类当中的各个成员函数该如何使用,接下来在本篇当中我们将试着模拟实现list,在本篇当中我们将通过模拟实现list过程中深入理解list迭代器和之前学习的vector和string迭代器的不同,接下来就开始…...
Pixel Couplet Gen 生成效果对比分析:不同参数下的对联质量评估
Pixel Couplet Gen 生成效果对比分析:不同参数下的对联质量评估 1. 引言:当AI遇上传统对联 春节贴对联是中国延续千年的文化传统,但创作一副既工整又有新意的对联并非易事。Pixel Couplet Gen作为一款AI对联生成工具,通过调整Te…...
避坑指南:lidar_align标定IMU外参时,loader.cpp源码修改与运动轨迹设计的那些关键细节
避坑指南:lidar_align标定IMU外参的核心细节与实战优化 在自动驾驶和机器人定位领域,激光雷达与IMU的联合标定是系统搭建的关键环节。许多开发者在初次使用lidar_align工具时会遇到各种问题——从源码适配的困惑到标定结果的不可靠。本文将深入剖析两个最…...
PHY芯片寄存器设计揭秘:从5位地址到分页扩展的演进史
PHY芯片寄存器设计演进:从5位地址到分页扩展的技术革命 当我们在享受千兆以太网带来的高速数据传输时,很少有人会想到这背后隐藏着一场持续了数十年的寄存器架构演进。PHY芯片作为网络通信的物理层核心,其寄存器设计经历了从简单固定到复杂可…...
FreeRTOS进阶:任务优先级与调度策略深度解析
1. FreeRTOS任务优先级基础 在嵌入式实时操作系统中,任务优先级决定了任务执行的先后顺序。FreeRTOS采用数值越大优先级越高的设计,优先级范围通常为0到(configMAX_PRIORITIES-1)。我刚开始接触FreeRTOS时,经常混淆这个概念,直到在…...
7天掌握Driver Store Explorer:Windows驱动管理的完整指南
7天掌握Driver Store Explorer:Windows驱动管理的完整指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Driver Store Explorer(简称RAPR)是…...
相场法模拟枝晶生长的karma模型研究:基于Matlab的实现
相场法模拟枝晶生长,karma模型,matlab咱们今天来玩点好玩的——用Matlab搞个金属凝固过程的枝晶生长模拟。相场法这玩意儿真是材料模拟界的万金油,特别是Karma模型,处理枝晶分岔那叫一个丝滑。先整点基础配置: % 基础参…...
Zigbee网关配网操作全解析:从连接到触发
1. Zigbee网关配网前的准备工作 第一次接触Zigbee网关配网的朋友可能会觉得有点复杂,但其实只要跟着步骤一步步来,整个过程并不难。我刚开始接触时也踩过不少坑,现在把这些经验都整理出来,希望能帮你少走弯路。 首先得确认你的硬件…...
Phi-4-mini-reasoning基础教程:理解其与Phi-4-standard在架构上的关键差异
Phi-4-mini-reasoning基础教程:理解其与Phi-4-standard在架构上的关键差异 1. 模型定位与核心能力 Phi-4-mini-reasoning是一个专注于推理任务的文本生成模型,与通用型的Phi-4-standard相比,它在数学推导、逻辑分析和多步推理等任务上表现出…...
【Linux】深入理解进程调度:从nice值到实时优先级(RT Priority)的进阶指南
1. Linux进程调度基础:从nice值说起 第一次接触Linux进程调度时,我被那个叫"nice值"的概念搞懵了。为什么用"nice"这个词?后来才明白,这个命名其实很形象——越"nice"的进程越谦让,愿意…...
从零开始:用Chipyard和FireSim在云端FPGA上仿真你的第一个RISC-V SoC
从零开始:用Chipyard和FireSim在云端FPGA上仿真你的第一个RISC-V SoC 在数字时代,RISC-V架构以其开放性和灵活性正在重塑计算领域。对于渴望探索SoC设计的开发者而言,云端FPGA资源与开源工具链的结合,彻底打破了硬件开发的高门槛。…...
