KingbaseES toast技术原理及实现
前言
1、TOAST的作用
TOAST全称是The Oversized-Attribute Storage Technique, 超大属性存储技术,就是超长字段在数据库中的存储方式。主要用来应对物理数据行超大的场景。
在KingbaseES中,页是数据在文件存储中的基本单位,它的大小是固定的,并且只能在编译期指定,默认的大小为8kb。同时不允许一行数据跨页存储。因此页大小就是行大小的硬上限,因此,引入了TOAST技术,TOAST技术是采用压缩和切片的方式,使得行的大小变小。需要说明这一技术对用户来说是完全透明的。
2、关于toast压缩
我们创建的每个表都有自己关联且唯一的TOAST表。当数据超过TOAST_TUPLE_THRESHOLD(默认2KB)时,数据库将压缩数据。
如果对大列数据的压缩后没有得到更小的块(<2KB),那么它将被拆分为更小的块,并存储在相关TOAST表中多个物理行(行外存储)。
每个原始表字段值都被一个指针替换,实际上根据这个指针可以找到对应toast表中行外存储的数据。
3、数据库中表字段的TOAST策略
PLAIN: 避免压缩和行外存储。
EXTENDED:允许压缩和行外存储。
EXTERNAL: 允许行外存储,但不允许压缩。
MAIN: 允许压缩,但不允许行外存储。
4、查看表字段的TOAST策略
[
](javascript:void(0)
EST=# \d+ t1
Table "PUBLIC.T1"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-------------------+-----------+----------+--------------+-------------
ID | INTEGER | | plain | |
NAME | CHARACTER VARYING | | extended | |
[
](javascript:void(0)
其中的Storage对应字段使用的TOAST策略。
5、修改表字段的TOAST策略
alter table tablename alter column column_name set storage EXTENDED;
toast技术的实现方式:
[
](javascript:void(0)
创建一张 tosttest 表
test=# create table tosttest(id int, tad text, name text);
CREATE TABLE
TEST=# \d+ tosttest;
Table "public.tosttest"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
--------+---------+-----------+----------+---------+----------+--------------+-------------
id | integer | | | | plain | |
tad | text | | | | extended | |
name | text | | | | extended | |
Access method: heap
如上,interger类型默认TOAST策略为plain,而text类型为extended,所以对于非变长数据类型默认是不需要toast存储的。如果表中字段需要用到TOAST,那么数据库会自动创建一张TOAST表负责行外存储。
test=# select relname,relfilenode,reltoastrelid from sys_class where relname='tosttest';
relname | relfilenode | reltoastrelid
----------+-------------+---------------
tosttest | 92932 | 92935
(1 row)
如上,我们查到 tosttest 表的 oid为92932,其对应 TOAST 表的 oid为92935,其对应TOAST表名则为:pg_toast.pg_toast_92932,我们可以看下定义:
test=# \d+ pg_toast.pg_toast_92932;
TOAST table "pg_toast.pg_toast_92932"
Column | Type | Storage
------------+---------+---------
chunk_id | oid | plain
chunk_seq | integer | plain
chunk_data | bytea | plain
验证toast表:
test=# insert into tosttest values(1, 'tad', '0123456789');
INSERT 0 1
test=# select * from tosttest;
id | tad | name
----+-------+------------
1 | tad | 0123456789
(1 row)
test=# select * from pg_toast.pg_toast_92932;
chunk_id | chunk_seq | chunk_data
----------+-----------+------------
(0 rows)
可以看到因为name只有10个字符,所以没有压缩,也没有行外存储。下面增加 name 的长度,看看会发生什么
test=# update tosttest set name=name||name where id=1;
UPDATE 1
test=# select id,tad,length(name) from tosttest;
id | tad | length
----+-------+--------
1 | tad | 20
(1 row)
test=# select * from pg_toast.pg_toast_92932;
chunk_id | chunk_seq | chunk_data
----------+-----------+------------
(0 rows)
反复执行如上过程,直到 pg_toast_92932 表中有数据:
test=# select id,tad,length(name) from tosttest;
id | tad | length
----+-------+--------
1 | tad | 327680
(1 row)
TEST=# select chunk_id,chunk_seq,length(chunk_data) from pg_toast.pg_toast_92932;
chunk_id | chunk_seq | length
----------+-----------+--------
92938 | 0 | 1988
92938 | 1 | 1781
(2 rows)
可以看到,直到 name 的长度为327680时,对应 TOAST 表中有了2行数据,且长度都是略小于2K,这是因为 extended 策略下,先启用了压缩,然后才使用行外存储。
下面我们将 name字段的 TOAST 策略改为 EXTERNA ,禁止压缩。
test=# alter table tosttest alter name set storage external;
ALTER TABLE
test=# \d+ tosttest;
Table "public.tosttest"
Column | Type | Modifiers | Storage | Stats target | Description
---------+---------+-----------+----------+--------------+-------------
id | integer | | plain | |
tad | text | | extended | |
name | text | | external | |
然后我们重新插入一条数据:
test=# insert into tosttest values(2, 'tad', '0123456789');
INSERT 0 1
test=# select id,tad,length(name) from tosttest;
id | tad | length
----+-------+--------
1 | tad | 327680
2 | tad | 10
(2 rows)
再次重复以上步骤,直到TOAST表中产生新的行:
test=# update tosttest set name=name||name where id=2;
UPDATE 1
TEST=# select id,tad,length(name) from tosttest;
id | tad | length
----+-----+--------
1 | tad | 327680
2 | tad | 5120
(2 rows)
TEST=# select chunk_id,chunk_seq,length(chunk_data) from pg_toast.pg_toast_92932;
chunk_id | chunk_seq | length
----------+-----------+--------
92938 | 0 | 1988
92938 | 1 | 1781
92940 | 0 | 1988
92940 | 1 | 1988
92940 | 2 | 1144
(5 rows)我们看到当, TOAST 表中产生了新的3条 chunk_id 为92940的行,且3行数据的 chunk_data 的长度之和正好等于name字段长度5120,所以这里并没有压缩。
[
](javascript:void(0)
总结:
如果存储策略允许压缩,则TOAST优先选择压缩。
不管是否压缩,一旦数据超过2KB,就会启用行外存储,数据存储到toast表中。
修改TOAST策略,不会影响现有数据的存储方式。
KingbaseES toast技术原理及实现的更多相关文章
- Atitit.ide技术原理与实践attilax总结
Atitit.ide技术原理与实践attilax总结 1.1. 语法着色1 1.2. 智能提示1 1.3. 类成员outline..func list1 1.4. 类型推导(type inferenc ...
- Atitit.异步编程技术原理与实践attilax总结
Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...
- Atitit 语音识别的技术原理
Atitit 语音识别的技术原理 1.1. 语音识别技术,也被称为自动语音识别Automatic Speech Recognition,(ASR),2 1.2. 模型目前,主流的大词汇量语音识别系统多 ...
- Atitit.gui api自动化调用技术原理与实践
Atitit.gui api自动化调用技术原理与实践 gui接口实现分类(h5,win gui, paint opengl,,swing,,.net winform,)1 Solu cate1 Sol ...
- 新手入门:史上最全Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- <转>VPN技术原理
原文地址:VPN技术原理 VPN,Virtual Private Network(虚拟专用 网络),被定义为通过一个公用网络(通常是因特网)建立一个临时的.安全的连接,是一条穿过公用网络的安全.稳定的 ...
- seo伪原创技术原理分析,php实现伪原创示例
seo伪原创技术原理分析,php实现伪原创示例 现在seo伪原创一般采用分词引擎以及动态同义词库,模拟百度(baidu),谷歌(google)等中文切词进行伪原创,生成后的伪原创文章更准确更贴近百度和 ...
- 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍
液晶常用接口“LVDS.TTL.RSDS.TMDS”技术原理介绍 1:Lvds Low-Voltage Differential Signaling 低压差分信号 1994年由美国国家半导体公司提出之 ...
- Ajax 技术原理(转)
Ajax 技术原理 2010-01-04 原文出处:http://www.nowamagic.net/ajax/ajax_AjaxPrinciple.php 在写这篇文章之前,曾经写过一篇关于AJAX ...
随机推荐
- Java8接口中抽象方法和default和static方法的区别和使用
Java接口说明 传统的理解是接口只能是抽象方法.但是程序员们在使用中,发现很不方便,实现接口必须重写所有方法,很麻烦.所以java设计者妥协了,在java8中,支持default和static方法, ...
- 微信小程序获取本日、本周、本月、本年时间段
原文链接 https://cslaoxu.vip/110.html 说明 最近需要用到统计不同时间段内的记录数,所以找了一下现成的工具类.下面就演示一下如何引用到实际项目中. 详细用法请参考:http ...
- 分层架构设计模式总结-MVC,洋葱架构,整洁架构,六边形架构,DDD等等
一.单层结构不分层 最开始开发项目时,由于需求较少,用一个单独的工程文件就可以满足开发的需求了,不需要进行划分. 二.MVC 分层和三层 到后面需求越来越多,于是就把文件进行分解,怎么分解?有人提出了 ...
- centos7.5 hadoop NAT 静态IP网络环境搭建
1 设置 VMware 网络环境 1. 选择VMNet8 并将子网IP 修改为 192.168.10.0,保证集群ip都在这个网段下 2. 选择NAT 设置,配置NAT的网关为 192.168.10. ...
- 07-Redis系列之-双写一致性,缓存详解和优化点
双写一致性 双写一致性指的是当我们更新了数据库的数据之后redis中的数据也要同步去更新. redis和mysql数据同步方案 先更新缓存,再更新数据库(然并软...) 先更新数据库,再更新缓存(一般 ...
- 【Azure APIM】APIM 策略语句如何读取请求头中所携带的Cookie信息并保存为变量
问题描述 需要在APIM策略中对请求所携带的Cookie中的token值进行JWT验证,如果获取Cookie中的值并且作为变量保存,然后在JWT 验证中使用呢? 问题解答 第一步:获取Cookie中的 ...
- 【Azure Cloud Service(Extended Support)】如何使用外延服务迁移应用?
问题一:迁移到云服务扩展后,之前经典版的云服务的部署槽会变成单一的部署槽,关于两个云服务扩展版之间的部署交换能否提供一个演示? 对于具有双槽的云服务(Classic),根据文档中的建议,在迁移到云服务 ...
- Java //遍历100以内的偶数,获取所有偶数的和,输出偶数的个数
1 //遍历100以内的偶数,获取所有偶数的和,输出偶数的个数 2 3 int i =1; 4 int sum = 0; 5 int count = 0; 6 for(i = 1;i<=100; ...
- AP渗透测试学习
1.测试指标 2.测试环境 SDK: Java JDK ,Android SDK 工具: 7zip dex2jar jd-gui apktool activity 劫持工具 3. ...
- 将MindSpore运行结果输出到log文件
技术背景 我们在Linux系统下使用一些深度学习框架(如MindSpore)运行脚本的时候,经常会用一些打印输出来判断当前执行的步骤,或者是使用打印输出来定位算法问题.但是在Linux系统下程序输出其 ...