热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

openGauss行存储核心架构及其页面组织详解

行存储的核心架构和页面组织是实现DML操作、可见性判断及多种管理功能的基础。作为基于磁盘的存储引擎,行存储在设计上采用了段页式结构,以优化数据的存储和访问效率。这种设计不仅确保了数据的高效存储,还为行存储的各种高级功能提供了坚实的技术支持。

行存储的Tuple结构以及页面组织,是行存储DML实现、可见性判断以及行存各种功能与管理机制的基石。

由于行存储是基于磁盘的存储引擎,因此在存储格式的设计中遵从段页式设计,存储结构需要以页面(page)作为单位,以方便与操作系统内核以及文件系统的接口进行交互。也是由于这个原因,页面的大小需要和目标系统中一个block(块)的大小对齐。在比较通用的linux内核中,页面大小默认一般为8192(8k)。一个基本的Heap(堆)页面如图9-3所示:

图9-3 Heap页面示意图

页面开头的位置为整个页面的头部信息,记录了这个页面的公用信息以及一些关键标识。

line_pointer被放置与Header后面,并向页面尾部扩展。line_pointer为指向tuple实际数据的一个指针,类似于sentinel(行指针)的作用。

这里需要一提的是,每个Tuple在系统中的唯一标识,ItemPointer,也被称为CTID,存储的是这一行所在的block number(即页面号)以及其对应的line_pointer的offset(即这个页面中第几个line_pointer)。这样由一个系统内记录的CTID,可以快速定位到这个Tuple的line_pointer,也就可以根据line_pointer的指针快速定位到Tuple的实际数据。

line_pointer的必要性也可以比较容易的总结出来。由于Tuple的数据内容本身可以是变长的,因此如果需要找到一个在页面中间的Tuple,则需要按序遍历页面结构;而line_pointer结构本身为定长,因此可以直接以常数的复杂度找到数据所在内存位置。Line_pointer sentinel的效果也十分明显:line_pointer的存在使得Tuple的对应改动局限于页面内部,而保持全局标识CTID不发生变化;如果没line_pointer,行更新需要连带更新的元信息、索引以及系统各处信息的复杂度就不言而喻了。

被line_pointer指向的行记录本身,则是从页面结尾开始向页面头部延展,这样避免的页面填充过程中可能出现的数据移动以及空间浪费。

页面头部的Header中储存了如下信息:

  1. Pd_lsn为最后一次改动此页面事务写下的WAL(系统中一般称为transaction log,简称xlog)的下一位,被xlog机制以及checkpoint机制所使用。
  2. Pd_checksum为页面中的checksum,为了检查页面的完整性和一致性使用。
  3. Pd_flags是此页面的标识位,可以让上层对此页面进行处理的接口快速识别此页面的一些特征,比如页面是否有空行/页面是否写满、页面是否已经对所有事务全部可见、页面是否被压缩等。
  4. Pd_lower和pd_upper是指向页面空闲空间起止的指针,即pd_lower指向下一个line_pointer的位置,而pd_upper指向下一个行记录数据填充的位置,这样既可以快速进行页面的填充修改,也可以方便计算页面的空闲空间。
  5. Pd_special指针用于记录一些特殊的存储管理方式以及接口所需的内存区域。
  6. pd_prune_xid记录上一次对此页面进行清理的xid。
  7. pd_xid_base以及pd_multi_base为这个页面上xid的base,即该页面上所有的记录的xid都由页面自身记录的xid(32位)与base(32位)计算得到,是64位xid的实现方式。

每个记录本身(上文Tuple的数据部分),则是数据库中最基本的数据存储单位,其自身的结构以及记录的信息也是系统中存储方式、DML、事务ACID的关键。如图9-4所示:

图9-4 数据部分结构

  1. Xmin是最初始的TransactionID(事务ID,简称XID),即插入此条记录的事务ID。
  2. Xmax是删除或更新此条记录的XID。如果此记录未被更改或删除,那么Xmax为0。
  3. T_cid记录的是command id,用于一个事务内部多步操作的一种记录与跟踪。
  4. T_ctid记录了此条记录的CTID值,或者是更新版本的CTID值。这个会在后面展开DML时讲到。
  5. 两个infomask是事务以及存储数据状态的标识位,用于快速判断。

Xmin、xmax两个事务ID、结合其transaction ID(事务ID)映射的Clog(提交日志)、CSN Log,一同构成了可见性判断的核心关键要素.


推荐阅读
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • CentOS 7 磁盘与文件系统管理指南
    本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
author-avatar
手机用户2502859805
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有