暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL技术大讲堂 - 第17讲:Vacuum空间管理工具

北京CUUG 2023-05-25
269











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) 如果最后一页没有元组,则截断最后一页。

(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,钉钉群专门有视频讲解










          相关阅读:

          PostgreSQL技术大讲堂 - 第12讲:WAL作用与管理
          PostgreSQL技术大讲堂 - 第13讲:Full-Page Writes 全页写
          PostgreSQL技术大讲堂 - 第14讲:检查点
          PostgreSQL技术大讲堂 - 第15讲:数据文件和块存储结构
          PostgreSQL技术大讲堂 - 第16讲:元组(行)结构与dml操作



          蓝蓝的天

          -->> 联系客服,进群或领取文档资料

          文章转载自北京CUUG,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论