IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 表膨胀终结者,金仓数据的表膨胀及对策 -> 正文阅读

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

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

在这里插入图片描述
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,表示仍然使用原有表空间。
清理过程如下:
在这里插入图片描述
5、清理完成后查看表的膨胀率
在这里插入图片描述
【更多人大金仓数据库信息, 详见 金仓文档管理系统

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:37:32  更:2022-02-26 11:40:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:24:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码