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

news/2024/7/9 19:32:26 标签: postgresql, 数据库

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

在PostgreSQL中,对于每一个表文件(包括系统表)都会同时存在一个名为OID_vm的空闲空间映射表,其中OID是对应表的oid。VM中为表的每个页设置了一位标识来表示该页是否存在无效元组。当页中所有的元组对于当前事务都是可见的,VM中对应的位为1,表示没有无效元组。对某个页中的元组进行更新或删除后,该页在VM中的标志为为0,表示有无效元组。注意设置VM时需要加锁。当页在VM中对应的标志为是1时,VACUUM会忽略对应的页,大大提高VACUUM的效率。

VACUUM有两种方式,即快速清理(Lazy VACUUM)和完全清理(FULL VACUUM)。VM文件仅在快速清理中被用到,对于FULL VACUUM,由于要执行跨页清理等复杂操作,还是需要扫描整个表文件,此时VM作用不大。当前VM文件是一个提示(hint)来加快VACUUM的速度,即使损坏了VM文件,仅仅会导致VACUUM忽略那些需要清理的页面,但元组的可见性依然不变,所以对数据不会产生任何影响。

每个VM文件的页中,可用的字节为blcksz - SizeOfPageHeaderData个,所以每个VM页能记录size = (blcksz - SizeOfPageHeaderData) * 8个表文件页的信息。


http://www.niftyadmin.cn/n/1842710.html

相关文章

MySQL存储引擎介绍及配置

目录概述各存储引擎的特性MyISAMInnoDBMEMORYMERGE如何选择合适的存储引擎查看当前的默认存储引擎修改默认的存储引擎设置存储引擎概述 插件式存储引擎是MySQL数据库最重要的特征之一,用户可以根据应用的需要选择如何存储和索引数据、是否使用事务等。 MySQL 5.0支…

PostgreSQL插件开发

PostgreSQL中许多控制信息都是以系统表的形式来管理,这个特点决定了PostgreSQL比其他数据库更容易进行内核扩展。PostgreSQL还提供了丰富的数据库内核编程接口,允许开发者以插件的形式将自己的代码融入内核。 PostgreSQL插件开发非常简单,下…

PostgreSQL内存上下文

不管是什么样的数据库系统,存储管理的本质都是一样的:如何减少I/O次数。内存的访问速度至少是磁盘的数十万倍,所以通常读写磁盘所用的时间决定了数据库操作的总时间,而内存的访问时间可以忽略不计。因此,要尽可能的提高…

git重置或还原已提交的代码--git reset和git revert

文章目录背景两种方式git resetgit revert背景 在多人协作时,对代码的管理,难免会出现错误。如果出现错误,我们分析下来是要进行一些回退操作,那么解决办法有如下两种: git reset git revert 两种方式 git reset 在…

PostgreSQL文本搜索(一)——简介

PostgreSQL文本搜索(一)——简介 文本搜索对于数据库系统来说是一个十分重要的功能,它可以在数据库文本文档(包括表中的text字段等)中搜索一个模式,可以是一个或多个单词、短语、短句,并且可以…

git clone时出现error: RPC failed; curl 18 transfer closed with outstanding read data remaining

目录问题原因1解决原因2解决打开下面的网站获取信息配置更新DNS问题 使用git bash 从github clone代码时遇到下面的错误 error: RPC failed; curl 18 transfer closed with outstanding read data remaining fatal: The remote end hung up unexpectedly fatal: early EOF fa…

PostgreSQL文本搜索(二)——表和索引

PostgreSQL文本搜索(二)——表和索引 上一节的例子说明了使用简单的常量字符串进行全文匹配。本节展示了如何搜索表数据,或选择使用索引。 搜索表 可以在没有索引的情况下进行全文检索。一个简单的查询是打印在body字段中包含friend这个词…

索引 - 学习总结

目录概述什么是索引索引的优缺点MySQL中索引的基本用法创建索引删除索引测试索引SQL SEERVER中索引的基本用法创建索引创建聚集索引创建复合索引创建覆盖索引创建唯一索引查看索引MySQL设计索引的原则SQL Server索引设计原则索引的数据结构聚集索引和非聚集索引复合索引的使用参…