前言

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技术原理及实现的更多相关文章

  1. Atitit.ide技术原理与实践attilax总结

    Atitit.ide技术原理与实践attilax总结 1.1. 语法着色1 1.2. 智能提示1 1.3. 类成员outline..func list1 1.4. 类型推导(type inferenc ...

  2. Atitit.异步编程技术原理与实践attilax总结

    Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...

  3. Atitit 语音识别的技术原理

    Atitit 语音识别的技术原理 1.1. 语音识别技术,也被称为自动语音识别Automatic Speech Recognition,(ASR),2 1.2. 模型目前,主流的大词汇量语音识别系统多 ...

  4. Atitit.gui api自动化调用技术原理与实践

    Atitit.gui api自动化调用技术原理与实践 gui接口实现分类(h5,win gui, paint opengl,,swing,,.net winform,)1 Solu cate1 Sol ...

  5. 新手入门:史上最全Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  6. Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  7. <转>VPN技术原理

    原文地址:VPN技术原理 VPN,Virtual Private Network(虚拟专用 网络),被定义为通过一个公用网络(通常是因特网)建立一个临时的.安全的连接,是一条穿过公用网络的安全.稳定的 ...

  8. seo伪原创技术原理分析,php实现伪原创示例

    seo伪原创技术原理分析,php实现伪原创示例 现在seo伪原创一般采用分词引擎以及动态同义词库,模拟百度(baidu),谷歌(google)等中文切词进行伪原创,生成后的伪原创文章更准确更贴近百度和 ...

  9. 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍

    液晶常用接口“LVDS.TTL.RSDS.TMDS”技术原理介绍 1:Lvds Low-Voltage Differential Signaling 低压差分信号 1994年由美国国家半导体公司提出之 ...

  10. Ajax 技术原理(转)

    Ajax 技术原理 2010-01-04 原文出处:http://www.nowamagic.net/ajax/ajax_AjaxPrinciple.php 在写这篇文章之前,曾经写过一篇关于AJAX ...

随机推荐

  1. Lambda 表达式总结

    1 Lambda 表达式简介 ​ Lambda 表达式是 JDK 8 的新特性,主要用于简化匿名内部类的定义,帮助用户方便.高效地书写优雅的代码. ​ Lambda 表达式实现的必须是一个接口,并且接 ...

  2. 全流程点云机器学习(一)使用CloudCompare自制sharpNet数据集

    前言 这不是高支模项目需要嘛,他们用传统算法切那个横杆竖杆流程复杂耗时很长,所以想能不能用机器学习完成这些工作,所以我就来整这个工作了. 工欲善其事,必先利其器,在正式开始之前,我们先要搞懂如何切分数 ...

  3. 华为OD请己经入职的人出来谈谈你的真实感受?

    修改了一下回答的排版,之前只要更新就在最前面, 现在按照会见顺序重新整理了一下. 部门捞人 上海 深圳 西安 东莞 办公地 武汉南京现在也有 通道:点击通道2字 写在前面 总结一下我的体验其实挺好的, ...

  4. 溯源反制-Mysql蜜罐

    东西比较老,类似的文章网上已经很多,原理主要是通过服务端的load data动作可以主动向客户端获取文件. 看过hfish等自带的mysql蜜罐读取/etc/passwd,感觉还差点实用性.这次文章主 ...

  5. python 创建动态类

    一般情况下多数是预先定义类 而少数特殊情况就需要去动态创建类了,直接贴代码. class BaseModel(Model): class Meta: database = _tb class_new ...

  6. [攻防世界][Web]ics-06

    打开靶机对应的url,展开是一个网站的样子,其实啥也么有 所有tab都点一遍,发现只有报表中心有内容,url为 http://61.147.171.105:49797/index.php?id=1 猜 ...

  7. 记一次WPF集成SemanticKernel+OneAPI+讯飞星火认知大模型实践

    开启OneAPI服务 OneAPI介绍 OpenAI 接口管理 & 分发系统,支持 Azure.Anthropic Claude.Google PaLM 2 & Gemini.智谱 C ...

  8. 01、SECS的基本概念

    最近做的项目跟半导体设备相关,需要学习SECS相关的内容,把自己的学习记录分享出来,如有不足甚至错误的地方,请不吝赐教,十分感谢! 文章内容基本都是SECS协议的内容和参考的资料,只不过是加了自己的理 ...

  9. 【Azure Redis 缓存】Redis 连接失败

    问题描述 Azure Redis 出现连接失败,过一会儿后,又能自动恢复. 问题解答 其实,因为Azure Redis服务一直都有升级维护的操作(平均每月一次),Redis服务更新是平台自动进行的计划 ...

  10. 【Azure 环境】Azure门户中 Metrics 图表的聚合指标每项具体代表什么意思呢?

    问题描述 下图中,指标里的每项聚合指标具体代表什么呢? 问题解答 Azure Metrics 指标中提供了五种基本的聚合类型. Sum - 在聚合间隔内捕获的所有值的总和. 有时称为总聚合. Coun ...