表膨胀终结者,金仓数据的表膨胀及对策

1、为什么会有表膨胀

多版本并发控制机制

多版本并发控制机制(MVCC)的原理在于,当它需要更改某块数据的时候,它不会直接去更改,而是会创建这份数据的新版本,在新版本进行更改,所以会存储多份版本,每个事务能看见哪一份版本的数据,由事务隔离级别控制。
MVCC引入了一个问题,如何消除老旧的、没有使用的无用数据(版本),目前主流上有3种处理实现方式:
第一种: 以Oracle为代表的,把旧版本数据放入UNDO,新数据放入REDO,然后更改数据。这种方式,旧版本的数据放入了UNDO,所以可以有效避免膨胀。
第二种: 以SQL Server为代表的,把旧版本的数据写入专门的临时表空间,新数据写入日志,然后去更改数据。这种方式,旧版本的数据放入了专门的临时表空间,所以也可以有效地避免膨胀。
第三种: 以PostgreSQL为代表的,把旧版本标示为无效,新数据写入日志,成功后把新版本的数据写入新的位置。这种实现机制是导致数据膨胀严重的一个重要原因,因为旧版本的数据虽然表示为无效状态,但是没被回收前还是占据存储空间。

金仓数据库的处理方式属于第三种,对于表膨胀,金仓数据库有如下对策。

2、如何处理表膨胀

(1)使用vacuum清理表膨胀

vacuum的主要任务就是清理表和索引中不需要的数据(dead tuples),为新加入的数据清理出来空间。
vacuum的执行过程主要分为以下三步

  1. 清除dead tuples指向的index tuples
  2. 移除dead tuples,更新VM和FSM
  3. 更新统计信息和相关系统表

但是vacuum也有存在的问题。比如,vacuum完成清理工作后,那些空间并没有真正被释放给操作系统,只能被vacuum清理过的表和索引所利用。

(2)使用vacuum full清理表膨胀

Vacuum Full和Vacuum最大的不同就是,Vacuum Full是物理删除dead tuples,并把释放的空间重新交给操作系统,所以在vacuum full后,表的大小会减小为实际的空间大小。
当然,vacuum full 也有存在的问题,在执行过程中,它会block所有对表的访问,不只是写操作,读操作也会全部block。很多情况下这是不可接受的,尤其是生产环境。

(3)、使用sys_squeeze无锁化清理表膨胀

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';

表膨胀终结者,金仓数据的表膨胀及对策_第1张图片
3、创建插件:

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,表示仍然使用原有表空间。
清理过程如下:
表膨胀终结者,金仓数据的表膨胀及对策_第2张图片
5、清理完成后查看表的膨胀率
表膨胀终结者,金仓数据的表膨胀及对策_第3张图片
【更多人大金仓数据库信息, 详见 金仓文档管理系统 】

你可能感兴趣的:(数据库,数据库,database,postgresql)