PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 Part 17:Vacuum空间管理工具 内容1:VACUUM 概述 内容2:可见性地图作用 内容3:冻结处理 内容4:Autovacuum daemon 内容5:Full VACUUM
VACUUM概述 · VACUUM概述Vacuum处理对数据库中的指定表或所有表执行以下任务: 1、移除死元组 删除死元组并对每个页面的活元组进行碎片整理。 删除指向死元组的索引元组。 2、冷冻老的Txid 必要时冻结老元组的Txid 更新冻结的与系统目录(pg_database和pg_class)相关的txid 如有可能,移除clog中不必要的部分 3、其他 更新已处理表的FSM和VM。 更新几个统计数据(pg_stat_all_tables等)
VACUUM处理流程 · VACUUM 处理流程 (1) 从指定的表中获取每个表。 (2) 获取表的ShareUpdateExclusiveLock锁。此锁允许读取其他事务。 (3) 扫描所有页面以获取所有死元组,必要时冻结旧元组。 (4) 如果存在,则移除指向相应死元组的索引元组。 (5) 对表的每一页执行以下步骤(6)和(7)。 (6) 移除死元组并重新分配页面中的活元组。 (7) 更新目标表的相应FSM和VM。 (8) 如果最后一页没有元组,则截断最后一页u003c/p> (9) 更新与目标表的真空处理相关的统计信息和系统目录。 (10) 更新与真空处理相关的统计数据和系统目录。 (11) 如果可能的话,删除不必要的文件和clog的页面 · 第一步 执行冻结处理并删除指向死元组的索引元组 1、扫描目标表,创建死元组列表 2、通过死元组列表删除索引元组,即“清理阶段” 3、如此循环,直到清完为止 · 清理操作流程 · 第二步 更新与每个目标表的真空处理相关的统计信息和系统目录。 此外,如果最后一页没有元组,则从表文件中将其截断。 如果可能的话,它会删除不必要的clog部分
可见性地图 · 提高vacuum的效率 可见性地图用来记录含有被删除行的数据块id,以提供给vacuum参考。
冻结处理 · 冻结处理流程 冻结处理有两种模式: lazy mode(惰性模式) eager mode(急切模式)
删除不需要的clog文件 · 删除clog文件
Autovacuum Daemon · Autovacuum 守护进程 默认每分钟执行一次,由autovacuum_naptime参数定义。 默认调用三个worker进程进行工作,由autovacuum_max_workers参数定义。
Full VACUUM · Full VACUUM · Full VACUUM 处理流程 什么时候需要FULL VACUUM? testdb=# CREATE EXTENSION pg_freespacemap; CREATE EXTENSION testdb=# SELECT count(*) as "number of pages", pg_size_pretty(cast(avg(avail) as bigint)) as "Av. freespace size", round(100 * avg(avail)/8192 ,2) as "Av. freespace ratio" FROM pg_freespace('accounts'); number of pages | Av. freespace size | Av. freespace ratio -----------------+--------------------+--------------------- 1640 | 99 bytes | 1.21
FULL VACUUM示例(一) testdb=# DELETE FROM accounts WHERE aid %10 != 0 OR aid < 100; DELETE 90009 testdb=# VACUUM accounts; VACUUM testdb=# SELECT count(*) as "number of pages", pg_size_pretty(cast(avg(avail) as bigint)) as "Av. freespace size", round(100 * avg(avail)/8192 ,2) as "Av. freespace ratio" FROM pg_freespace('accounts'); number of pages | Av. freespace size | Av. freespace ratio -----------------+--------------------+--------------------- 1640 | 7124 bytes | 86.97 (1 row)
FULL VACUUM示例(二) testdb=# SELECT *, round(100 * avail/8192 ,2) as "freespace ratio" FROM pg_freespace('accounts'); blkno | avail | freespace ratio -------+-------+----------------- 0 | 7904 | 96.00 1 | 7520 | 91.00 2 | 7136 | 87.00 3 | 7136 | 87.00 4 | 7136 | 87.00 5 | 7136 | 87.00
FULL VACUUM示例(三) testdb=# VACUUM FULL accounts; VACUUM testdb=# SELECT count(*) as "number of blocks", pg_size_pretty(cast(avg(avail) as bigint)) as "Av. freespace size", round(100 * avg(avail)/8192 ,2) as "Av. freespace ratio" FROM pg_freespace('accounts'); number of pages | Av. freespace size | Av. freespace ratio -----------------+--------------------+--------------------- 164 | 0 bytes | 0.00 (1 row)
以上就是Part 17 - Vacuum空间管理工具 的内容,欢迎进群一起探讨交流QQ交流群:752027153微信交流群:联系客服拉你进微信PG交流群钉钉交流群:35822460,钉钉群专门有视频讲解
|