垃圾回收影响因素

影响垃圾回收的因素有很多,垃圾回收不及时,最直接导致表膨胀,详情查看文档《KingbaseESV8R6 垃圾回收原理以及如何预防膨胀》。

vacuum回收垃圾的tuple时,判断哪些dead tuple可以被回收的规则是判断当前数据库中backend_xid和backend_xmin最小的值,凡是超过这个最小值的事务产生的垃圾都不能回收。所以在数据库中如果存在长时间不结束的事务是很危险的操作。

如果配置了old_snapshot_threshold.

则需要记录每分钟最大的backend_xid(没有则取最小未分配事务号) list(而非backend_xmin),vacuum时用于判断。

vacuum时,在1. old_snapshot_threshold最老的记录 与 2.当前系统最小的backend_xmin, backend_xid中取最大值,超过这个值的则垃圾不能回收。

使用old_snapshot_threshold可以避免长时间持有xmin的事务的sql导致其后产生的垃圾无法回收的问题。

测试

1.持有xid时,vacuum无法回收。

session a:
test=# begin;
BEGIN
test=# select txid_current(); -- 持有xid后的垃圾无法回收
txid_current
--------------
115627
(1 row) session b:
test=# delete from e1;
DELETE 10000
超过old_snapshot_threshold阈值后,仍然无法回收垃圾tuple
test=# vacuum verbose e1;
INFO: vacuuming "public.e1"
INFO: "e1": found 0 removable, 10000 nonremovable row versions in 45 out of 45 pages
DETAIL: 10000 dead row versions cannot be removed yet, oldest xmin: 115627
There were 0 unused item identifiers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
VACUUM
session a 提交后可回收。
  1. 长时间持有xmin,但是不持有xid时,可以回收其垃圾(必须配置 old_snapshot_threshold > 0)
session a:
test=# select pg_sleep(1000); session b:
test=# insert into e1 values (1);
INSERT 0 1
test=# delete from e1;
DELETE 1
test=# insert into e1 values (1);
INSERT 0 1
test=# delete from e1;
DELETE 1
时间超过old_snapshot_threshold后,可以回收
test=# vacuum verbose e1;
INFO: vacuuming "public.e1"
INFO: index "idx_e1" now contains 0 row versions in 30 pages
DETAIL: 0 index row versions were removed.
27 index pages have been deleted, 0 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO: "e1": found 0 removable, 0 nonremovable row versions in 0 out of 45 pages
DETAIL: 0 dead row versions cannot be removed yet, oldest xmin: 115633
There were 0 unused item identifiers.
Skipped 0 pages due to buffer pins, 45 frozen pages.
0 pages are entirely empty.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
VACUUM

总结

虽然设置参数old_snapshot_threshold可以解决垃圾无法回收问题,那只对于持有xmin的快照事务,而持有xid的事务这个参数是不生效的。

开启快照过旧,对性能有影响。

因为每次获取快照都要更新SNAPSHOT TOO OLD需要用到的数据结构列表。同时get buffer page时,每次都要判断,是否满足快照过旧。

KingbaseESV8R6垃圾回收受到参数old_snapshot_threshold的影响的更多相关文章

  1. KingbaseESV8R6 垃圾回收原理以及如何预防膨胀

    背景 KingbaseESV8R6支持snapshot too old 那么实际工作中,经常看到表又膨胀了,那么我们讨论一下导致对象膨胀的常见原因有哪些呢? 未开启autovacuum 对于未开启au ...

  2. jvm系列五、jvm垃圾回收机制、jvm各种参数及调优

    转载自:http://yufenfei.iteye.com/blog/1746914 尊重原创. 一.GC有两种类型:Scavenge GC 和Full GC 1.Scavenge GC 一般情况下, ...

  3. 案例实战:每日上亿请求量的电商系统,JVM年轻代垃圾回收参数如何优化?

    出自:http://1t.click/7TJ 目录: 案例背景引入 特殊的电商大促场景 抗住大促的瞬时压力需要几台机器? 大促高峰期订单系统的内存使用模型估算 内存到底该如何分配? 新生代垃圾回收优化 ...

  4. 每日上亿请求量的电商系统,JVM年轻代垃圾回收参数如何优化? ----实战教会你如何配置

    目录: 案例背景引入 特殊的电商大促场景 抗住大促的瞬时压力需要几台机器? 大促高峰期订单系统的内存使用模型估算 内存到底该如何分配? 新生代垃圾回收优化之一:Survivor空间够不够 新生代对象躲 ...

  5. .NET垃圾回收 – 原理浅析

    在开发.NET程序过程中,由于CLR中的垃圾回收(garbage collection)机制会管理已分配的对象,所以程序员就可以不用关注对象什么时候释放内存空间了.但是,了解垃圾回收机制还是很有必要的 ...

  6. JVM垃圾回收机制总结(3) :按代垃圾收集器

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的 . 因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  7. java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  8. JVM虚拟机学习一:垃圾回收算法总结

    1.java虚拟机中涉及到的数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某 ...

  9. Unity优化方向——优化Unity游戏中的垃圾回收(译)

    介绍 当我们的游戏运行时,它使用内存来存储数据.当不再需要该数据时,存储该数据的内存将被释放,以便可以重用.垃圾是用来存储数据但不再使用的内存的术语.垃圾回收是该内存再次可用以进行重用的进程的名称. ...

随机推荐

  1. 利用XtraDiagram.DiagramControl进行流程图形的绘制和控制

    DevExpress提供了一个比较强大的图形绘制工具,可以用于绘制各种图形,如流程图.组织机构图等等,本篇随笔介绍XtraDiagram.DiagramControl的使用,以及利用代码对其属性进行控 ...

  2. RPA教程

    匠厂出品,必属精品   Uipath中文社区qq交流群:465630324 uipath中文交流社区:https://uipathbbs.comRPA之家qq群:465620839 第一课--UiPa ...

  3. Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现

    前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...

  4. 广义径向基网络(RBF网络)

  5. 禁用Chrome自动更新

    删除下Update目录 C:\Program Files (x86)\Google\Chrome\

  6. Hive sql 经典题目和 复杂hsq

    案例一 练习:一:将下列数据加载hive表. 员工信息表emp:字段:员工id,员工名字,工作岗位,部门经理,受雇日期,薪水,奖金,部门编号英文名:EMPNO,ENAME,JOB,MGR,HIREDA ...

  7. React报错之Cannot find name

    正文从这开始~ .tsx扩展名 为了在React TypeScript中解决Cannot find name报错,我们需要在使用JSX文件时使用.tsx扩展名,在你的tsconfig.json文件中把 ...

  8. YII扩展功能图

  9. 利用Docker挂载Nginx-rtmp(服务器直播流分发)+FFmpeg(推流)+Vue.js结合Video.js(播放器流播放)来实现实时网络直播

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_75 众所周知,在视频直播领域,有不同的商家提供各种的商业解决方案,其中比较靠谱的服务商有阿里云直播,腾讯云直播,以及又拍云和网易云 ...

  10. placeholder 设置换行三种方式

    在 html 中编写代码时保留代码换行 <textarea name="" id="" cols="30" rows="10 ...