前言

默认情况下,vacuum表不能释放磁盘空间,只是在dead tuple做个标记位,但heap table末端的垃圾页可以被truncate,从磁盘中释放空间。例如表的末尾的100个数据块里面全是垃圾,那么这100个数据块可以truncate阶段,文件也会变小。而位于其他位置的垃圾页,不能回收,因为会影响寻址(ctid)的变化,而末尾全垃圾的页被截断时不影响寻址。但是KingbaseESV8R6开始,这个截断动作可以被控制,如果表的参数vacuum_truncate设置为false,那么末尾的垃圾页不会被回收。

有这样一个例子,一些表还会往里面写入大量数据时,没有必要回收,因为extend block也是有锁的,还有收缩文件需要对表加access exclusive lock,那么会产生锁冲突,这时候可以将vacuum_truncate设置为false。

vacuum_truncate controls whether vacuum tries to truncate off any empty pages at the end of the table. Previously vacuum always  tried to do the truncation. However, the truncation could cause  some problems; for example, ACCESS EXCLUSIVE lock needs to  be taken on the table during the truncation and can cause  the query cancellation on the standby even if hot_standby_feedback  is true. Setting this reloption to false can be helpful to avoid  such problems.

例子

1、创建两张表,表u1的vacuum_truncate设置为false,表u2使用默认参数。

test=# create table u1(id int,info text) with(vacuum_truncate=false);

CREATE TABLE

test=# create table u2(id int,info text);

CREATE TABLE

2、插入数据,查看表大小

TEST=# insert into u1 select generate_series(1,100000),md5(random()::text);

INSERT 0 100000

TEST=# insert into u2 select generate_series(1,100000),md5(random()::text);

INSERT 0 100000

TEST=# \dt+ u1;

List of relations

Schema | Name | Type | Owner | Size | Description

--------+------+-------+--------+---------+-------------

public | u1 | table | system | 6760 kB |

(1 row)

TEST=# \dt+ u2;

List of relations

Schema | Name | Type | Owner | Size | Description

--------+------+-------+--------+---------+-------------

public | u2 | table | system | 6760 kB |

(1 row)

3、删除末端数据,对比观察表大小是否变化

可以看到u2表末端的空间被回收了,而u1表大小不变。

TEST=# delete from u2 where id <> 1;

DELETE 99999

TEST=# vacuum u2;

VACUUM

TEST=# \dt+ u2

List of relations

Schema | Name | Type | Owner | Size | Description

--------+------+-------+--------+-------+-------------

public | u2 | table | system | 48 kB |

(1 row)

TEST=# delete from u1 where id <> 1;

DELETE 99999

TEST=# vacuum u1;

VACUUM

TEST=# \dt+ u1

List of relations

Schema | Name | Type | Owner | Size | Description

--------+------+-------+--------+---------+-------------

public | u1 | table | system | 6768 kB |

(1 row)

启用或禁用真空以尝试截断此表末尾的所有空白页。默认值为true。如果为true,则VACUUM和autovacuum执行截断操作,并将截断页面的磁盘空间留给操作系统。但是,截断需要表上的访问独占锁。这可能会阻塞查询操作。

注意:如果vacuum_truncate为true,在vacuum 时会尝试获取ACCESS EXCLUSIVE lock,如果无法取得 ACCESS EXCLUSIVE lock , 则跳过,不会进行trucate 操作。

KingbaseESV8R6 heap table末端垃圾页回收机制的更多相关文章

  1. 理解闭包 js回收机制

    为什么要有回收机制?why? 打个比方,我有一个内存卡,这个内存是8G的,我把文件,视频,音乐,都保存到了这个内存卡,随着我的储存的内容越来越多,这个内存卡已经保存不了了,如果我还想再把其他的文件保存 ...

  2. Linux内核分析:页回收导致的cpu load瞬间飙高的问题分析与思考--------------蘑菇街技术博客

    http://mogu.io/156-156 摘要 本文一是为了讨论在Linux系统出现问题时我们能够借助哪些工具去协助分析,二是讨论出现问题时大致的可能点以及思路,三是希望能给应用层开发团队介绍一些 ...

  3. Java进阶3. 内存回收机制

    Java进阶3. 内存回收机制 20131029 前言: 学过C++的都知道,C++中内存需要程序员自己维护.说道这里,很多开发的同学就感觉很痛苦,当他转向Java的时候,就会说你看Java多好啊,程 ...

  4. JVM的生命周期、体系结构、内存管理和垃圾回收机制

    一.JVM的生命周期 JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实例就诞生了, ...

  5. asp.net 之 GC (垃圾回收机制)

    今天抽时间好好整理了下GC相关知识,看了CSDN和博客园的几篇文章,有了一定的简单了解,决定根据个人理解整合一份随笔写下来,望诸位指教. 一:基础问题 1.首先需要知道了解什么是GC? GC如其名,就 ...

  6. .Net 垃圾回收机制原理(二)

    英文原文:Jeffrey Richter 编译:赵玉开 链接http://www.cnblogs.com/yukaizhao/archive/2011/11/25/dot_net_GC_2.html ...

  7. .NET垃圾回收机制 转

    在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR( ...

  8. JVM垃圾回收机制入门

    前言 数据库是大家会普遍重视的一个领域,异步通信一般用不到,虚拟机在大部分时候不会出问题,常被人忽视,所以我打算先学习虚拟机,从零单排Java高性能问题. 堆内存存储结构 Java6是以年代来规划内存 ...

  9. java基础(一):谈谈java内存管理与垃圾回收机制

    看了很多java内存管理的文章或者博客,写的要么笼统,要么划分的不正确,且很多文章都千篇一律.例如部分地方将jvm笼统的分为堆.栈.程序计数器,这么分太过于笼统,无法清晰的阐述java的内存管理模型: ...

  10. 《转载》JVM垃圾回收机制

    本文转载自ImportNew - 郑雯 每个Java程序员迟早都会碰到下面这个错误: java.lang.OutOfMemoryError 这个时候一般会建议采用如下方式解决这个错误: 增加MaxPe ...

随机推荐

  1. 文心一言 VS 讯飞星火 VS chatgpt (199)-- 算法导论15.2 1题

    一.用go语言,对矩阵规模序列(5,10,3,12,5,50,6),求矩阵链最优括号化方案. 文心一言,代码正常运行: 在Go语言中,为了找到矩阵链乘法的最优括号化方案,我们通常会使用动态规划(Dyn ...

  2. win32 - Direct3D 11的demo创建

    我们可以使用D3D为游戏,科学和桌面应用程序创建3-D图形. 非官方demo实例: https://github.com/Ray1024/D3D11Tutorial 当然,我们第一步要开始认识里面的基 ...

  3. win32 - DIB 与 DDB

    设备相关位图(DDB): DDB不包含颜色值,因为每个设备可以具有自己的一组颜色,所以为一个设备创建的DDB可能无法在其他设备上很好地显示. DDB通常被称为兼容位图,并且它通常比DIB具有更好的GD ...

  4. Golang gRPC学习(05): retry重试

    什么是重试 如果服务出现了错误,主要是网络,服务器出现了短暂异常的时候,该怎么办? 我们都会人工或者自动的重新连接服务试试,看服务是否恢复可用了. 这种重新进行连接服务的一种方式就是重试.如果是在微服 ...

  5. 探秘C语言数组:解锁高效数据管理与多维空间编程技巧"

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 引言 前面贝蒂给大家介绍了选择结构与循环结构,今天,贝蒂准备给大家介绍C语言中一个非常重要 ...

  6. git回退至指定版本,并更新远程仓库

    1. git log   查到commit记录 2.复制 commit 后面的id 3. git reset --hard  commit 后面的id   // 回退 4. 强制更新远程仓库  git ...

  7. Programming Abstractions in C阅读笔记:p293-p302

    <Programming Abstractions in C>学习第73天,p293-p302总结,总计10页. 一.技术总结 1.时间复杂度 (1)quadratic time(二次时间 ...

  8. 常见的问题系列--- Swagger @ApiOperationSupport忽略失效的问题

    https://www.cnblogs.com/hujunwei/p/15853307.html

  9. RK3568开发笔记(三):RK3568虚拟机基础环境搭建之更新源、安装网络工具、串口调试、网络连接、文件传输、安装vscode和samba共享服务

    前言   开始搭建RK3568的基础虚拟机,具备基本的通用功能,主要包含了串口工具minicom,远程登陆ssh,远程传输filezilla,代码编辑工具vscode.   虚拟机   文档对对虚拟机 ...

  10. python Apscheduler持久化

    from pytz import utc from apscheduler.schedulers.background import BackgroundScheduler from apschedu ...