多版本并发控制机制(MVCC)的原理在于,当它需要更改某块数据的时候,它不会直接去更改,而是会创建这份数据的新版本,在新版本进行更改,所以会存储多份版本,每个事务能看见哪一份版本的数据,由事务隔离级别控制。
MVCC引入了一个问题,如何消除老旧的、没有使用的无用数据(版本),目前主流上有3种处理实现方式:
第一种: 以Oracle为代表的,把旧版本数据放入UNDO,新数据放入REDO,然后更改数据。这种方式,旧版本的数据放入了UNDO,所以可以有效避免膨胀。
第二种: 以SQL Server为代表的,把旧版本的数据写入专门的临时表空间,新数据写入日志,然后去更改数据。这种方式,旧版本的数据放入了专门的临时表空间,所以也可以有效地避免膨胀。
第三种: 以PostgreSQL为代表的,把旧版本标示为无效,新数据写入日志,成功后把新版本的数据写入新的位置。这种实现机制是导致数据膨胀严重的一个重要原因,因为旧版本的数据虽然表示为无效状态,但是没被回收前还是占据存储空间。
金仓数据库的处理方式属于第三种,对于表膨胀,金仓数据库有如下对策。
vacuum的主要任务就是清理表和索引中不需要的数据(dead tuples),为新加入的数据清理出来空间。
vacuum的执行过程主要分为以下三步
但是vacuum也有存在的问题。比如,vacuum完成清理工作后,那些空间并没有真正被释放给操作系统,只能被vacuum清理过的表和索引所利用。
Vacuum Full和Vacuum最大的不同就是,Vacuum Full是物理删除dead tuples,并把释放的空间重新交给操作系统,所以在vacuum full后,表的大小会减小为实际的空间大小。
当然,vacuum full 也有存在的问题,在执行过程中,它会block所有对表的访问,不只是写操作,读操作也会全部block。很多情况下这是不可接受的,尤其是生产环境。
sys_squeeze是KingbaseES的一个扩展插件,该组件将提供人工调用命令实现对表dead tuple的清理工作。该组件在清理表空间的过程中,不会全程加排他锁,能保证运行期间尽可能不影响对目标表的访问。
sys_squeeze相比vacuum full最大的优势在于:
它也只会在最后检查并完成增量数据以及切换filenode的过程中加排他锁,其他过程中是不影响读写。
sys_squeeze用法示例:
1、数据构造
create table a (a int primary key,b text);
insert into a values(generate_series(1,10000000),now());
delete from a where a <=4000000;
update a set a=a+6000000;
2、查看膨胀率
SELECT
schemaname||'.'||relname as table_name,
pg_size_pretty(pg_relation_size(schemaname||'.'||relname)) as table_size,
n_dead_tup,
n_live_tup,
round(n_dead_tup * 100 / (n_live_tup + n_dead_tup),2) AS dead_tup_ratio
FROM
pg_stat_all_tables
WHERE
relname = 'a';
create extension sys_squeeze ;
该插件的实现依赖于逻辑解码,因此使用该插件之前必须保证数据库wal_level等级设置为’logical’。
金仓数据库提供了在线wal_level切换功能,不用停库即可实现wal_level切换。
ALTER SYSTEM SET wal_level = logical;
select pg_reload_conf();
4、使用sys_queeze插件清理表a
select squeeze.squeeze_table('public','a',null,null, null);
函数squeeze.squeeze_table(opt1,opt2,opt3,opt4,opt5) 有5个可配置参数:
opt1: 填写所要清理的目标表的模式名,必须项
opt2: 填写所要清理的目标表名,必须项
opt3: 指定该表中已存在的index 名,若指定,会在新生成的表空间中按照此index顺序物理排列tuple,可选项,不指定填null
opt4: 指定将新生成的表置入指定的表空间。 可选项,若不指定填null,表示仍然使用原有表空间。
opt5: 将相应index置入指定的表空间。可选项,若不指定填null,表示仍然使用原有表空间。
清理过程如下:
5、清理完成后查看表的膨胀率
【更多人大金仓数据库信息, 详见 金仓文档管理系统 】