-
PG先写脏页还是先写WAL?
2023年09月10日 in PG 内核
微信公众号原文 昨天在群里遇到一个有趣的关于 PostgreSQL 的问题: ”写脏数据页和写入WAL缓冲区的先后顺序是什么?“ 我们都知道, WAL 就是 Write Ahead Log / 预写式日志 的缩写,那从逻辑上说,好像是先写 WAL 再写数据页才对。 但其实这个问题有趣在,写入其实是发生在两个地方的:内存与磁盘。而这对这两者的写入顺序是不一样的:在内存中,先写脏数据页,再写 WAL记录。在刷盘时,先刷 WAL 记录,再刷脏数据页。 我们可以用一个简单的例子来说明, …
-
第一章 数据库的物理/逻辑结构
2018年01月11日 in PG 内核
第一章和第二章简单介绍了一些PostgreSQL的基础知识,有助于读者理解后续章节的内容。本章包括以下几个主题: 数据库集簇(database cluster) 的逻辑结构 数据库集簇的物理结构 堆表(heap table) 文件的内部布局 从表中读写数据的方式 如果你已经熟悉这些内容,可以跳过本章。 1.1 数据库集簇的逻辑结构 数据库集簇(database cluster) 是一组 数据库(database) 的集合,由一个PostgreSQL服务器管理。第一次听到这个定义也许会令人疑 …
-
第二章 进程和内存架构
2018年01月10日 in PG 内核
本章总结了PostgreSQL中进程与内存的架构,有助于读者理解后续章节。 如果读者已经熟悉这些内容,可以直接跳过本章。 2.1 进程架构 PostgreSQL是一个客户端/服务器风格的关系型数据库管理系统,采用多进程架构,运行在单台主机上。 我们通常所谓的“PostgreSQL服务器(PostgreSQL Server)” 实际上是一系列协同工作的进程集合,包含着下列进程: Postgres服务器进程(Postgres Server Process) 是所有数据库集簇管理进程的父进程。 每个后 …
-
第四章 外部数据包装器
2018年01月08日 in PG 内核
本章将介绍一种相当实用,而且很有趣的特性:外部数据包装器(Foreign Data Wrapper FDW)。 4.1 外部数据包装器(FDW) 2003年,SQL标准中添加了一个访问远程数据的规范,称为SQL外部数据管理(SQL/MED)。PostgreSQL在9.1版本开发出了FDW,实现了一部分SQL/MED中的特性。 在SQL/MED中,远程服务器上的表被称为外部表(Foreign Table)。 PostgreSQL的外部数据包装器(FDW) 使用与本地表类似的方式,通过SQL/MED …
-
第六章 垃圾清理过程
2018年01月06日 in PG 内核
**清理(VACUUM)**是一种维护过程,有助于PostgreSQL的持久运行。它的两个主要任务是删除死元组,以及冻结事务标识,两者都在第5.10节中简要提到过。 为了移除死元组,清理过程有两种模式:并发清理(Concurrent Vacuum) 与完整清理(Full Vacuum) 。并发清理(通常简称为VACUUM)会删除表文件每个页面中的死元组,而其他事务可以在其运行时继续读取该表。相反,完整清理不仅会移除整个文件中所有的死元组,还会对整个文件中所有的活元组进行碎片整理。而其他事务在完整 …
-
第七章 堆内元组与仅索引扫描
2018年01月05日 in PG 内核
本章中介绍两个和索引扫描有关的特性—— 堆内元组(heap only tuple, HOT)和仅索引扫描(index-only scan) 。 7.1 堆内元组(HOT) 在8.3版本中实现的HOT特性,使得更新行的时候,可以将新行放置在老行所处的同一个数据页中,从而高效地利用索引与表的数据页;HOT特性减少了不必要的清理过程。 在源码的README.HOT中有关于HOT的详细介绍,本章只是简短的介绍HOT。首先,7.1.1节描述了在没有HOT特性的时候,更新一行是怎样一个过程,以阐明要解决的问 …
-
第八章 缓冲区管理器
2018年01月04日 in PG 内核
缓冲区管理器(Buffer Manager)管理着共享内存和持久存储之间的数据传输,对于DBMS的性能有着重要的影响。PostgreSQL的缓冲区管理器十分高效。 本章介绍了PostgreSQL的缓冲区管理器。第一节概览了缓冲区管理器,后续的章节分别介绍以下内容: 缓冲区管理器的结构 缓冲区管理器的锁 缓冲区管理器是如何工作的 环形缓冲区 脏页刷写 图8.1 缓冲区管理器,存储和后端进程之间的关系 8.1 概览 本节介绍了一些关键概念,有助于理解后续章节。 8.1.1 …