• KingbaseESV8R6垃圾回收受到参数old_snapshot_threshold的影响


    垃圾回收影响因素

    影响垃圾回收的因素有很多,垃圾回收不及时,最直接导致表膨胀,详情查看文档《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无法回收。

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

    总结

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

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

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

  • 相关阅读:
    一文整明白Researcher ID与ORCID
    qt多个信号如何关联一并处理
    基于FPGA的五段流水CPU设计
    1534_TriCore编译器Tasking使用_汇编语言语法以及标识符
    最全面的SpringMVC教程(三)——跨域问题
    JavaWeb Filter 过滤器
    多目标优化算法:多目标圆圈搜索算法(Multi-Objective Circle Search Algorithm,MOCSA)
    基于Next.js、Prisma、Postgres和Fastfy构建全栈APP
    技术管理进阶——跨级管理/汇报
    java封装国密SM4为 jar包,PHP调用
  • 原文地址:https://blog.csdn.net/lyu1026/article/details/126317761