资讯专栏INFORMATION COLUMN

PostgreSQL膨胀表或索引收缩插件之pg_squeeze

IT那活儿 / 3035人阅读
PostgreSQL膨胀表或索引收缩插件之pg_squeeze
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

  

PostgreSQL的MVCC是通过使用一种多版本模型来维护,所以表或索引的膨胀是不可避免的。

通常我们收缩膨胀表或索引可以使用vacuum full、rewrite table(如在线CLUSTER)的方式重建表,至于索引可以重建或重定位表的索引。

但上面说的方式是需要持有排它锁,会堵塞读操作。为了减少锁冲突,相应的插件就应运而生,例如pg_squeeze、pg_repack等。


pg_squeeze和pg_repack区

首先说pg_repack,pg_repack 是pg_reorg的一个分支。其工作机制如下

  • 创建一个日志表来记录对原始表所做的更改。
  • 在原始表上添加一个触发器,将 INSERT、UPDATE 和 DELETE 记录到我们的日志表中。
  • 创建一个包含旧表中所有行的新表。
  • 在这个新表上建立索引。
  • 将日志表中产生的所有更改应用到新表。
  • 使用system catalog(包含了元数据的VIEW和表的一个schema)交换表,包括索引和toast table。
  • 删除原始表。
从上述pg_repack的工作机制来看,其使用了新建表的方式重组数据,最后通过切换完成数据重组。仅仅在切换时需要持有排他锁,因时间非常短暂,影响比VACUUM FULL和rewrite的方式小很多。但是pg_repack都需要建触发器,记录下增量重组时,原表产生的增量数据。因此重组时,触发器及原表的DML会带来一定的影响
而pg_squeeze的工作原理是创建一个新的数据文件,然后在复制快照时将所做的更改应用到表中。这是使用REDO和logical replication来捕获对重建表的数据更改的方式来完成。

所以相对于pg_repack,其不需要建触发器,并且在重组时对原表的DML几乎没有性能影响。另外pg_squeeze支持自动重组。即通过设置阈值,自动启动WORKER进程,将数据复制到重组表,最后加锁切换。但是要求表必须有一个PRIMARY KEY,或者在非空列上至少有一个唯一索引。

pg_squeeze安装及使用

下载路径如下:

https://github.com/cybertec-postgresql/pg_squeeze

1. 设置PG_CONFIG环境变量,安装时,我们必须确保路径中的pg_config 版本正确
2. 编译安装
3. 修改postgresql.conf 参数文件并重启生效
wal_level = logical
max_replication_slots = 1             #或者在当前值上加1
shared_preload_libraries = pg_squeeze    #将pg_squeeze添加到现有库中。
4. 使用超级用户创建扩展pg_squeeze
CREATE EXTENSION pg_squeeze;
常规处理表注册详细:
要使“pg_squeeze”扩展知道该表,您需要在“squeeze.tables”表中插入一条记录。添加后,会定期检查表的统计信息。每当表满足要“squeezed”的条件时,就会将“任务”添加到队列中。
最简单的“注册”如下:
INSERT INTO squeeze.tables (tabschema, tabname, schedule)
VALUES (public, person, ({10}, {23}, NULL, NULL, {4, 6}));
可以选择指定其他列,例如:
INSERT INTO squeeze.tables
(tabschema, tabname, schedule, free_space_extra, vacuum_max_age,max_retry)
VALUES (public, person, ({10}, {23}, NULL, NULL, {4, 6}), 30,2 hours, 2);
释:表“public”.“person”在每周四和周六的 23:10 进行检查。空闲空间阈值为30%。

字段描述如下:

  • tabschema”和“tabname”分别是模式和表名。

  • schedule”列告诉何时应该检查表,并且可能会被squeezed。调度由以下复合数据类型的值描述,CREATE TYPE schedule AS ( minutes minute[], hours hour[], days_of_month dom[], months month[], days_of_week dow[] );
    “minutes”(0 到 59)和“hours”(0 到 23)指定一天内的检查时间,而“days_of_month”(1 到 31)、“months”(1 到 12)和“days_of_week” "(0 到 7,其中 0 和 7 都代表星期日)确定日期。

    如果“分钟”、“小时”和“月”都与当前时间戳匹配,则执行检查,而 NULL 值分别表示任何分钟、小时和月。至于“days_of_month”和“days_of_week”,至少其中之一需要与当前时间戳匹配,或者两者都需要为 NULL 才能进行检查。

  • free_space_extra”表示空闲空间超过多少时就会对表进行重建,默认是50。

  • min_size”是表必须占用的最小磁盘空间(以 MB 为单位)才能进行处理。默认值为 8。

  • vacuum_max_age”当进行一次vacuum后,认为fsm是有效的最大时间,默认1小时。

  • max_retry”当重建表失败时最大的重新尝试的次数,默认是0。

  • clustering_index”是已处理表的现有索引。处理完成后,表的元组将按此索引的键进行物理排序。

  • rel_tablespace”是表应该移动到的现有表空间。NULL 意味着表应该保持在原来的位置。

  • ind_tablespaces”是一个二维数组,其中每一行指定索引的表空间映射。第一列和第二列分别代表索引名和表空间名。所有未指定映射的索引都将保留在原始表空间中。

  • skip_analyze”表示表处理后不应该有ANALYZE命令。默认值为“false”,表示默认执行 ANALYZE。

启动pg_squeeze自动处理命令
SELECT squeeze.start_worker();
关闭pg_squeeze命令
SELECT squeeze.stop_worker();
设置squeeze.max_xlock_time控制最大占用锁的时间。
SET squeeze.max_xlock_time TO 100;
:单位为毫秒。
临时处理:
还可以手动收缩表,而无需注册,跳过任何时间和膨胀检查。
squeeze.squeeze_table(tabchema name, tabname name, clustering_index name, rel_tablespace name, ind_tablespaces name[])
例:
SELECT squeeze.squeeze_table(public, person_old202209, null, null, null);


本文作者:魏 斌(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129227.html

相关文章

  • PostgreSQL的实践一:初识

    摘要:每个服务由多个进程组成,为首的进程名为。服务使用字节长的内部事务标识符,即时发生重叠后仍然继续使用,这会导致问题,所以需要定期进行操作。操作被认为是紧跟操作后的操作。在涉及高比例插入删除的表中,会造成索引膨胀,这时候可以重建索引。 简介和认知 发音 post-gres-q-l 服务(server) 一个操作系统中可以启动多个postgres服务。每个服务由多个进程组成,为首的进程名为p...

    yibinnn 评论0 收藏0
  • 跟着大彬读源码 - Redis 8 - 对象编码字典

    摘要:属性记录了哈希表目前已有节点键值对的数量。字典字典的结构类型特定函数私有数据哈希表两个记录进度的标志。此外,字典在进行时,删除查找更新等操作会在两个哈希表上进行。在对哈希表进行扩容或收缩操作时,使用渐进式完成。 字典,是一种用于保存键值对的抽象数据结构。由于 C 语言没有内置字典这种数据结构,因此 Redis 构建了自己的字典实现。 在 Redis 中,就是使用字典来实现数据库底层的。...

    kun_jian 评论0 收藏0
  • 对Flex布局的总结与思考

    摘要:主轴方向的多余空间的出现是因为容器宽度元素项宽度之和。对空间分配的思考是如何计算项的宽度的所有项先按照原始宽度在容器中排列。开发时布局的一般流程根据设计,确定需要多少行来显示所有内容,然后确定每一行有哪些项。对每一项,定义其样式。 阅读本文之前最好对flex布局有基本了解,可以通过参考资料中列举的资源来学习。 flex布局规范的设计目标 一维布局模型(one-dimensional...

    springDevBird 评论0 收藏0
  • Multi-Model多模数据库引擎设计与实现

    摘要:数据库多模是指同一个数据库支持多个存储引擎,可以同时满足应用程序对于结构化半结构化非结构化数据的统一管理需求。多模式数据管理能力,使得数据库能够进行跨部门跨业务的数据统一存储与管理,实现多业务数据融合,支撑多样化的应用服务。 如今,随着业务互联网化和智能化的发展以及架构 微服务和云化的发展,应用系统对数据的存储管理提出了新的标准和要求,数据的多样性成为了数据库平台面临的一大挑战,数据库...

    UCloud 评论0 收藏0
  • 系统架构

    强力推荐!那些你不能错过的 GitHub 插件和工具 以代码托管平台起家的 GitHub 网站,已然成为全球程序员工作和生活中不可或缺的一份子。从优秀的企业,到优秀的程序员,都将自己最优秀的代码作品存放在这片开源净土里,供彼此学习交流。 GitHub Trending 栏目甚至已经成为 IT 从业人员的新闻日报,每日必读。在之前的一… PostgreSQL 数据库的前世今生 编辑:IT大咖说阅读字...

    Gilbertat 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<