数据库杂谈

PostgreSQL空闲空间映射表(FSM)

PostgreSQL空闲空间映射表(FSM) 随着数据表中不断插入和删除元组,页内必然会产生空闲空间。当我们需要插入新的元组时,需要优先将元组放到已有页内的空闲空间内,以节约存储空间。如果每次都用新的页来存放新元祖,显然会造成空间利用率的浪费。但我们怎么知道哪个页中有空闲空间、空闲空间的大小是否足够存放新的元组呢?如果没有其他任何技术,则需要遍历页、直到找到足够的空闲空间用于插入新元组,这...

PostgreSQL内存上下文

PostgreSQL内存上下文 不管是什么样的数据库系统,存储管理的本质都是一样的:如何减少I/O次数。内存的访问速度至少是磁盘的数十万倍,所以通常读写磁盘所用的时间决定了数据库操作的总时间,而内存的访问时间可以忽略不计。因此,要尽可能的提高I/O命中率,让最可能被使用的文件块停留在内存中。除此之外,内存管理还是整个数据库系统的桥梁,每一个模块都会使用到内存进行函数运行、缓冲、消息传递等,...

PostgreSQL可见性映射表(VM)和VACUUM操作

PostgreSQL可见性映射表(VM)和VACUUM操作 PostgreSQL为了实现多版本并发控制(MVCC),当事务删除或者更新元组时,并非从物理上删除,而是将其标记无效,最终再通过VACUUM命令清理这些无效元组,真正的物理删除发生在清理过程。清理无效元组时,需要先找到无效元组,再进行清理。如果没有其他技术,需要遍历查找每一个页,找到页中的无效元组。如果更新和删除不是很频繁,表文件...

PostgreSQL插件开发

PostgreSQL插件开发 PostgreSQL中许多控制信息都是以系统表的形式来管理,这个特点决定了PostgreSQL比其他数据库更容易进行内核扩展。PostgreSQL还提供了丰富的数据库内核编程接口,允许开发者以插件的形式将自己的代码融入内核。 PostgreSQL插件开发非常简单,下面举一个例子,开发一个随机测试数据生成器。 插件名为pg_testgen,首先需要创建四个文...

PostgreSQL表和元组的组织方式

PostgreSQL表和元组的组织方式 上面讲过PostgreSQL的页大小为8K,这意味着堆文件大小最小为8K,且一定为8K的整数倍。对于PostgreSQL,单个堆文件的最大大小限制为1G,超过1G的表会被分成多个堆文件存储。 每一个8K的页面的结构如下图: 这里每一个tuple存储一条数据记录,从数据页底部开始向前依次存储,这些堆元组的地址由一个4B大小的行指针所指向。这些行...

页大小——数据库文件IO的基本单位

页大小——数据库文件IO的基本单位 除redis等内存数据库外,几乎所有的数据库都是将数据以文件的形式存储在磁盘、SSD硬盘等存储介质里的。目前绝大部分数据库系统的存储介质都是磁盘,磁盘的读写都是以扇区为单位,每一个扇区的大小是512字节,硬件的特点决定了操作系统、数据库系统等程序的最小文件IO单位是512字节。为了文件读写的效率,数据库系统不直接使用512B的最小粒度,而是采用更大的页来...