前言

默认情况下,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. Java设计模式-组合模式Composite

    介绍 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系. 组合模式依据树形结构来组合对 ...

  2. Vue+SpringBoot+ElementUI实战学生管理系统-6.院系管理模块

    1.章节介绍 前一篇介绍了用户管理模块,这一篇编写院系管理模块,需要的朋友可以拿去自己定制.:) 2.获取源码 源码是捐赠方式获取,详细请QQ联系我 :)! 3.实现效果 院系列表 修改院系 4.模块 ...

  3. C++ 多线程的错误和如何避免(9)

    有时候使用 std::atomic 比使用 mutexes 更高效 问题分析:使用多线程更新一些简单数据时,比如 int 型,bool 型等等,可以使用 std::atomic,这比 mutex 来得 ...

  4. geacon_pro配合catcs4.5上线Mac、Linux

    最新最全文章见我个人博客: xzajyjs.cn 一些链接 Try师傅的catcs4.5项目: https://github.com/TryGOTry/CobaltStrike_Cat_4.5,最新版 ...

  5. Java JVM——3.运行时数据区概述及线程

    运行时数据区概述 在JVM 中的位置 内部划分 当我们通过前面的:类的加载 → 验证 → 准备 → 解析 → 初始化 这几个阶段完成后,执行引擎就会对我们的类进行使用,同时执行引擎将会使用到我们的运行 ...

  6. python中如何使两个序列相加不改变内存地址的几种方式

    # 方式1 a = [1,2,3] print(a) # 4551311680 a.extend([4,5]) print(a) # 4551311680 # 方式2 b = [1,2,3] prin ...

  7. Windows Docker Destop修改默认镜像文件位置

    0.首先关闭docker destop. 1.通过Everything或者资源管理器找到以.vhdx结尾的文件所在的位置,这些就是docker镜像路径 2.我的路径:C:\Users\Administ ...

  8. docker安装mysql服务

    拉取镜像 docker pull mysql:5.7.3 运行镜像 docker run -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.32 # -e MYSQL_ ...

  9. rpa:小红书为例讲解界面选取和界面库选取两种元素选择方式的区别执行js获取数据

    上文有讲到rpa从安装到第一个小例子的运行,这篇文章我们讲解rpa的两种元素选择方式说明:界面选取和界面库选取. 首先,我们需要知道为什么需要选取元素,以及选取了元素之后有什么作用? 现在有一种这样的 ...

  10. Java 异常处理(2) : 方法重写的规则之一:

    1 package com.bytezero.throwable; 2 3 import java.io.FileNotFoundException; 4 import java.io.IOExcep ...