资讯专栏INFORMATION COLUMN

Pgsql表膨胀的产生及处理

IT那活儿 / 3421人阅读
Pgsql表膨胀的产生及处理



表膨胀的产生



们知道Oracle的多版本并发控制是基于块级的,利用回滚段(UNDO)机制。在回滚段中保存了某个数据被修改之前的前映像的数据。而PostgreSQL中没有UNDO这一概念,PostgreSQL中的多版本并发是通过在表中数据行的多个版本来实现的,例如在一张表中我们要更新一条记录,PG并不是直接修改该数据,而是通过插入一条全新的数据,同时对老数据加以标识。

PostgreSQL的MVCC机制在数据更新时会产生死元组(dead tuples),如果果不清理掉那些dead tuples(对任何事务都是不可见的)将会永远留在数据文件中,浪费磁盘空间,对于表来说,有过多的删除和更新,dead tuples很容易占绝大部分磁盘空间。而且dead tuples也会在索引中存在,更加加重磁盘空间的浪费。这在PostgreSQL中称之为膨胀(bloat)。自然的,需要处理的数据查询越多,查询的速度就越慢。



表膨胀的查询



查询表膨胀可以使用插件pgstattuple,提供了pgstatetuple()和pgstatindex()两个统计表和索引的方法。

初次使用这个插件时需要创建:

创建测试表:

查看表的死元组,可以看到刚建的表死元组为0,表膨胀系数0:

做些DML操作,观察表的死元组占比13%,表的膨胀系数34%:



表膨胀的清理



1. 执行 vacuum清理死元组,清理后表的死元组为0,表的膨胀系数还是34%:

可见vacuum命令通常不会将磁盘空间返回给操作系统,但它将使它对新行可用。这时我们需要使用vacuum full 命令来回收空间。

注意:vacuum full 会回收空间并返回给操作系统,但是它有很多缺点。首先,它会产生独立锁,阻塞所有操作(包括select).其次,它实际上创建了一个表的副本,使所需的磁盘空间加倍,因此当系统可用磁盘空间很少时,就不太实用。

2. 插件实现:

vacuum full会产生独立锁,阻塞所有操作(包括select),我们可以使用插件pg_squeeze来完成这个操作,它使用REDO和logical replication实现增量重组,不需要建立触发器,但是要求表上面有PK或者UK。

由于pg_squeeze需要使用logical replication,所以必须设置足够多的slots,而且必须注意可能与STANDBY争抢SLOTS,必须预留足够的SLOTS。

使用示例 squeeze.squeeze_table(tabchema name, tabname name,

clustering_index name, rel_tablespace name, ind_tablespaces name[]):

另外由于pg_squeeze可以自动,也可以不设置自动的收缩。对于自动的收缩,建议不要对繁忙的数据库开启,以免在高峰期触发,带来一定的性能影响。

--注册任务(示例表示:public下的表test,在每天的23:10分检查,当表的空闲空间超过10时对表重建)

insert into squeeze.tables (tabschema, tabname, schedule, free_space_extra) values (public, test, ({10}, {23}, NULL, NULL, NULL), 10);

--查看任务

select * from squeeze.tables;

--开启进程

select squeeze.start_worker();

--查看任务记录

select * from squeeze.tables_internal;

--关闭进程

select squeeze.stop_worker();

任务完成后可以查看任务记录:


END


更多精彩干货分享

点击下方名片关注

IT那活儿

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

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

相关文章

  • 使用sphinx search打造你自己中文搜索引擎

    摘要:本文以为例来介绍如何打造自己的搜索引擎。其官方网站是可以说支持包括英文中文等所有语言的搜索。默认把中文按字拆分的,但这样就会产生搜索出不相干的内容来。因此,有人就给打了中文分词的补丁。 Google搜索引擎建立至今已经快20年了,之后全球各类大大小小类似的搜索引擎也陆续出现、消亡。国内目前以百度为大,搜狗、360、必应等也势在必争。搜索引擎技术也发展的相当成熟,同时也就出现了很多开源的...

    trigkit4 评论0 收藏0
  • PostgreSQL实践一:初识

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

    yibinnn 评论0 收藏0
  • python 图像处理:一福变五福

    摘要:某宝一年一度的集五福活动更是成为每年的必备活动。今年再来对福字做文章,演示下如何用的图像处理功能,把一幅福字图片转出种不同的效果最图像处理最常用的两个模块是和,这里我们选择。轮廓福使用了自带的图像轮廓提取功能。 快过年了,各种互联网产品都出来撒红包。某宝一年一度的集五福(shua hou)活动更是成为每年的必备活动。虽然到最后每人大概也就分个两块钱,但作为一个全民话题,大多数人还是愿意...

    JinB 评论0 收藏0
  • iOS利用OpenCV 实现文字行区域提取尝试

    摘要:这是坐标百度,好像没啥好研究的了,不过出于好奇还是想知道使用是如何做到把文字区域进行框选的,所以接下来我们就看看如何在上使用实现图片中的文字框选。一些探索 最近下了几个OCR的App(比如白描),发现可以选中图片中的文字行逐行转成文字,觉得很有意思(当然想用要花钱啦),想着自己研究一下实现原理,google之后,发现了两个库,一个是OpenCV,在机器视觉方面应用广泛,图像分析必备利器。另一...

    番茄西红柿 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

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