前言

默认情况下,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. spring boot和redis实现自定义前后分离token认证

    说明:文章部分代码引用自github 本项目地址:https://gitee.com/indexman/redis-token-demo 1.token认证流程 此处以前端页面请求后端用户列表接口为例 ...

  2. 揭秘一线大厂Redis面试高频考点(3万字长文、吐血整理)

    ## # 3万+长文揭秘一线大厂Redis面试高频考点,整理不易,求一键三连:点赞.分享.收藏 本文,已收录于,我的技术网站 aijiangsir.com,有大厂完整面经,工作技术,架构师成长之路,等 ...

  3. .net core6 Autofac依赖注入

    一.引言 .net core6在文件方面是精简了,所以配置方面也发生了部分变化:下面记录下.net core6中怎么配置Autofac 进行依赖注入. 二.项目创建 1).首先引用两个包:在Nuget ...

  4. Java 通过属性名称读取或者设置实体的属性值

    原因 项目实战中有这个需求,数据库中配置对应的实体和属性名称,在代码中通过属性名称获取实体的对应的属性值. 解决方案 工具类,下面这个工具是辅助获取属性值 import com.alibaba.fas ...

  5. Vue源码学习(十一):计算属性computed初步学习

    好家伙,   1.Computed实现原理 if (opts.computed) { initComputed(vm,opts.computed); } function initComputed(v ...

  6. 关于debian11无法安装星火商店的解决方法

    #!/bin/bash if [ "$(id -u)" != "0" ] then echo "请确保你使用root权限启动此脚本" exi ...

  7. ubuntu中在命令行如何打开图形界面的文件夹的几种方法

    方法一: 使用自带的命令:nautilus . 打开当前文件夹 nautilus . 打开指定路径文件夹 nautilus ddd/ccc/ 方法二:xdg-open xdg-open 命令相当于在 ...

  8. 2.4G无线音频传输方案市场调研分析

    基本概念   所谓的2.4G音频传输,不是使用标准的wifi和蓝牙协议传输,而是使用私有的2.4G通信协议来实现点对点,一对多和多对一的音频传输.2.4G私有协议音频传输,有这低延时,距离远,声音高清 ...

  9. ESP8266 SPI 开发之软硬基础分析

    一 什么是SPI接口? SPI是一种高速.高效率的串行接口技术.通常由一个主模块和一个或多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据的交换.SPI是一个环形结构,通信时需要至少4根线 ...

  10. BES2300方案设计开发阶段总结

    前记   从事BES芯片的方案设计已经快三年了 ,这三年,伴随着和BES的一起共同成长,我们做了不少业内大的客户.从去年年初开始接触2300方案开发,到目前为止,已经做出了不少产品.这里就说一下心得体 ...