小本本的介绍
你好啊,我是本际云服务器推荐网的小编小本本。今天我想和大家分享一下关于PostgreSQL处理膨胀与事务回卷的相关知识。

表膨胀查询与处理
要处理表膨胀问题,我们可以采取以下操作:
- 创建扩展
create extension pgstattuple; - 查询出表的膨胀系数:
select *,1.0-tuple_len::numeric/table_len as bloat from pgstattuple(tab_brin1);其中tab_brin1是表的名称,会占用2414个page。 - 使用
vacuum(verbose,full,analyze)tab_brin1命令来处理表膨胀问题。在执行时,有几个可选的命令可以使用:vacuum:进行垃圾收集,将垃圾空间标识为可用的状态。它不会影响其它事务发出的表上的读操作和写操作。vacuum full:启动完全垃圾收集,对表进行垃圾回收期间,其它的事务不能对表进行读操作和写操作。执行时间比vacuum要长,也执行的操作更多。vacuum analyze:除了回收垃圾空间还会收集优化器统计数据。vacuum verbose:输出垃圾收集的详细数据。
执行完成后,再次查询表的膨胀系数,应该得到更低的值。
select *,1.0-tuple_len::numeric/table_len as bloat from pgstattuple(tab_brin1);表占用473个page。
数据库防止事务回卷
为了防止同一个数据库中的最新和最旧的两个事务之间的年龄不超过2^31,PostgreSQL引入了冻结(freeze)功能。在处理事务回滚问题时,需要注意以下术语:
- 表年龄:当前事务号距上一次执行freeze操作的事务id的差值。
- 元组年龄:当前元组的xmin距上一次执行freeze操作的事务id的差值。
- 当新老事务id差超过21亿的时候,事务号会发生回卷,此时数据库会报出如下错误并且拒绝接受所有连接,必须进入单用户模式执行vacuum freeze操作。
- 设置好相关参数是十分重要的。对于业务繁忙的库,我们可以设置
vacuum_cost_delay为一个比较高的值,这样可以减少普通vacuum对正常数据查询的影响。我们也应该密切关注长事务。如果快达到触发值的话,我们应该选择一个业务低峰期窗口主动执行vacuum freeze操作,而不是等待数据库被动触发。 - 此外,我们还可以针对大表采取分区的方式处理问题,以减少对系统的IO压力。每个表的数据量不宜过大,我们可以针对不同的表、不同的业务进行个别设置。
以上就是我分享的关于PostgreSQL处理膨胀与事务回卷的一些知识,希望对大家有所帮助。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/5972.html
