PostgreSQL(二十三)TOAST技术

news2024/9/20 12:33:06

目录

一、TOAST简介

二、TOAST的存储方式

1、存储方式概述

2、实验:创建TOAST表

三、TOAST的4种压缩策略

1、策略说明

2、TOAST表额外的三个字段

四、TOAST表的计算方式

1、说明

2、实验:计算表大小

五、TOAST表的特点

1、优点

2、缺点

3、访问成本的计算

六、PG TOAST技术与Oracle大对象存储方式的对比


一、TOAST简介

1、TOAST技术:The OverSized Attribute Storage Technique,超尺寸字段在PG的存储方式。

2、TOAST技术产生背景:元组不允许跨页面存储。

3、TOAST技术特点:它会将大字段值压缩或者分散为多个物理行来存储。

4、对于用户来说,这一技术实现是透明的,无需关注。

二、TOAST的存储方式

1、存储方式概述

        PG的部分类型数据支持toast,因为有些字段类型是不会产生大字段数据(比如date、time、boolean等)。支持TOAST的数据类型应当是可变长度的(variable-length)。

        假如PG的表中任何一个字段存在TOAST,这个表都会有这一个相关联的TOAST表TOAST表的OID被存储在pg_class.reltoastrelid

        超尺寸字段超出的数值将会被分割成chunks,并且最多toast_max_chunk_size 个byte(缺省是2KB)

        当某列存储的数据长度超过toast_tuple_threshold值(通常是2KB),就会触发TOAST存储。

        TOAST将会压缩或者移动字段值直到超出部分比toast_tuple_targer值小(这个值通常也是2KB)。

2、实验:创建TOAST表

(1)创建模拟表,包含允许TOAST的字段

--创建表时使用text数据类型,可实现列值长度超过2KB就自动产生toast表来存储
CREATE TABLE toast_t(id int,vname varchar(48),remark text);

(2)更改列的压缩方式为main

//语法:
ALTER TABLE ${tab_name} ALTER COLUMN ${col_name}
SET STORAGE {PLAIN | EXTENDED | MAIN(缺省) | EXTERNAL };

//示例:
ALTER TABLE toast_t ALTER COLUMN remark SET STORAGE main;

(3)查看Toast表的名字

//查看toast表的oid
SELECT relname,relfilenode,reltoastrelid FROM pg_class WHERE relname='toast_t';

//根据toast表oid查看其名字
SELECT relname FROM pg_class WHERE oid = '$reltoastrelid';

三、TOAST的4种压缩策略

1、策略说明

2、TOAST表额外的三个字段

//查看TOAST表结构,TOAST表属于pg_toast模式
\d+ pg_toast.pg_toast_16385

四、TOAST表的计算方式

1、说明

        在PG中,计算一个表的大小时要注意统计TOAST的大小,因为对超长字段存储时,在基础表上可能只存了20%,另外的数据都存到了TOAST里面去了,计算大小时要结合起来看。

        索引也是一样,对于表里有extended或者external类型的,会创建TOAST表,两者的关联是通过pg_class里的OID去关联的。

2、实验:计算表大小

(1)第一次插入:remark列的值小于2k的数据

        此时remark列值长度小于2KB,所以不会触发TOAST存储,TOAST表的大小为0。

//往上面创建的实验表toast_t中插入数据
ALTER TABLE toast_t ALTER COLUMN remark SET STORAGE extended;
INSERT INTO toast_t SELECT generate_series(1,4),repeat('kenyon here'||'^_^',2),repeat('^_^ Kenyon is not God,Remark here!!',1000);

//查看表中列值大小:
SELECT pg_column_size(id),pg_column_size(vname),pg_column_size(remark) from toast_t limit 10; 

//查看基础表大小
SELECT pg_size_pretty(pg_relation_size('toast_t'));

//查看TOAST表大小
SELECT pg_size_pretty(pg_relation_size('16396'));

(2)第二次插入:remark列的值刚好比2k大一点的数据

        由结果观察可知,此时TOAST表的大小不再为0,而toast_t表的大小没有变化。

        这说明,当remark列值超过2kb左右时,触发了TOAST存储方式,且在列尺寸超过2k的时候就会把数据存放到toast表中,不影响基础表的大小。

//继续插入数据,并查看数据
INSERT INTO toast_t SELECT generate_series(3,4),repeat('kenyon here'||'^_^',2),repeat('^_^ Kenyon is not God,Remark here!!',5500);
SELECT pg_column_size(id),pg_column_size(vname),pg_column_size(remark) FROM toast_t limit 10;
SELECT pg_size_pretty(pg_relation_size('toast_t'));
SELECT pg_size_pretty(pg_relation_size('16396'));


(3)第三次插入:插入更大的数据

        可以看到后插入的数据随着字段内容的增多,toast 段一直在变大,而基础表的大小并没有变化。

//继续插入更多的数据并查看toast表大小:
INSERT INTO toast_t SELECT generate_series(1,2),repeat('kenyon here'||'^_^',2),repeat('^_^ Kenyon is not God,Remark here!!',10000);
SELECT pg_column_size(id),pg_column_size(vname),pg_column_size(remark) FROM toast_t limit 10;
SELECT pg_size_pretty(pg_relation_size('toast_t'));
SELECT pg_size_pretty(pg_relation_size('16396'));

五、TOAST表的特点

1、优点

(1)可以存储超长超大字段,避免之前不能直接存储的限制 ;

(2)物理上与普通表是分离的,检索查询时不检索到超长字段时,会极大地加快速度;

管理小tip:

       鉴于TOAST表的特性,可能会出现:超长列只有部分存储数据在原始表中,而有部分存储在TOAST表中。

        为了底层存储区分开方便管理,可以设置将超长列的全部数据都存储在Toast表中:

ALTER TABLE ${tab_name} ALTER COLUMN ${col_name} SET STORAGE  external;

(3)update情景,该表的Toast数据没有被更新时,只需要更新普通表,不用去更新TOAST表;

2、缺点

(1)对大字段的索引创建是一个问题,有可能会失败,通常不建议在大字段上创建,而是选择全文检索。

(2)大字段的更新会有点慢,其它类型的数据库也会存在相同问题。

(3)在全表扫描情况下,有TOAST表的存在,会大大增加访问成本。

3、访问成本的计算

使用explain不会统计toast访问部分的代价。需要单独使用explain统计访问toast表的代价。

Toast表的成本统计案例如下:

(1)创建表toast_t1,插入数据,remark值小于2kb,不触发TOAST存储机制

CREATE TABLE toast_t1 (id int, vname varchar(48), remark text);
INSERT INTO toast_t1 SELECT generate_series(1,2),repeat('kenyon here'||'^_^',2),repeat('^_^ Kenyon is not God,Remark here!!',2000);
\d+ toast_t1
SELECT relname,oid,reltoastrelid FROM pg_class WHERE relname = 'toast_t1';
SELECT pg_size_pretty(pg_relation_size('toast_t1'));     (查原始表的存储大小)
SELECT pg_size_pretty(pg_relation_size('16440'));     (查TOAST表的存储大小)

 2、创建表 toast_t2,插入数据,remark值大于2kb,触发TOAST存储机制

CREATE TABLE toast_t2 (id int, vname varchar(48), remark text);
ALTER TABLE toast_t2 ALTER COLUMN remark SET STORAGE external;
INSERT INTO toast_t2 SELECT generate_series(1,2),repeat('kenyon here'||'^_^',2),repeat('^_^ Kenyon is not God,Remark here!!',2000);
\d+ toast_t2
SELECT relname,oid,reltoastrelid FROM pg_class WHERE relname = 'toast_t2';
SELECT pg_size_pretty(pg_relation_size('toast_t2'));     (查原始表的存储大小)
SELECT pg_size_pretty(pg_relation_size('16445'));     (查TOAST表的存储大小)

(3)查询toast_t1所有列扫描的代价

toast_t1没有触发TOAST表存储,因此14就是t2全表扫描的全部代价(450行)

EXPLAIN ANALYZE select * from toast_t1;

 (4)查询toast_t2所有列扫描的代价(加上访问TOAST部分的成本)

toast_t2触发了TOAST表存储,因此需要将基表与TOAST表的全表扫描代价相加,即:14+39=53

EXPLAIN ANALYZE select * from toast_t2;

综上可知,t2的全表扫描代价远高于t1表(20004>1350)。    

        因此,不触发TOAST表、将长数据与其他数据存储在基表中,是全表扫描时更好的存储方式。 

六、PG TOAST技术与Oracle大对象存储方式的对比

        Oracle11g版本中推出了针对LOB(Blob、Clob)字段处理的新技术:SecureFiles。PG的TOAST技术与它有相似之处。

        SecureFiles技术也是指定另外的 segment 来存储LOB字段,而不是在原表中存储,且可以设置 enable_storage_in_row 来指定表中存储。

        经测试,在Oracle数据库中,将其中一个100GB的LOB字段转换为SecureFiles,并采用压缩技术之后,最终只消耗30GB空间,大大压缩了存储空间。

        而SecureFiles技术还涉及到以下内容:

(1)新的网络协议

       SecureFiles提供一种新的Client/Server(C/S)方式的内部读写机制,有效提高了大量数据传输的效率。

(2)简化物理属性设计和管理

      SecureFiles提供了大量自动化的物理属性机制,免去了大量物理属性设计和管理工作。例如:CHUNK属性为可变长,最大能支持到64M;Oracle能自动进行碎片整理等。

(3)自动管理redo和undo

      SecureFiles还可以自动进行redo和undo的管理,避免大量不必要的redo和 undo信息的产生。

        由上可知,该技术在性能、可管理性、易用性等方面,具有如下具体特点和优势:

(1)提供数据去重、压缩和透明加密功能

(2)SecureFiles不仅可以有效降低LOB字段存储空间消耗,提高访问效率,而且提高了LOB字段的数据安全性。

小结:oracle在大对象存储压缩上,比pg做的稍好一些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【KAN】【API教程】get_fun

抽取某个激活函数的样子 from kan import * import matplotlib.pyplot as plt # create a KAN: 2D inputs, 1D output, and 5 hidden neurons. cubic spline (k3), 5 grid intervals (grid5). model KAN(width[2,5,1], grid5, k3, seed0) x torch.normal(0,1,size(100,2)) m…

给虚拟机Ubuntu扩展硬盘且不丢数据

1.Ubuntu关机状态下先扩展,如扩展20GB 2.进入ubuntu,切换root登录,必须是root全选,否则启动不了分区工具gparted 将新的20GB创建好后,选择ext4,primary; 3.永久挂载 我的主目录在/并挂载到/dev/sda1 从图…

C++解决:早餐组合

前言 应该都知道我之前沉默了很长一段时间,现在慢慢想明白了,会继续创作,真的非常感谢大家对我这个幼稚小孩的支持与鼓励。 有朋友私信问我退的原因,在这里和大家简要说一下【狗头】 我认识一位开学初三的学长,他和…

H81002S 1.7mm网络变压器:BMS汽车蓝牙接收器中的超薄共模电感科技

华强盛导读:在当今这个日新月异的汽车科技领域,每一处细节都蕴含着创新与突破。作为电动汽车心脏的电池管理系统(BMS),其高效稳定的运行不仅关乎续航与安全,更是智能化驾驶体验的基石。而在这背后&#xff…

有那些AI数字人制作软件?

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 之前由于工作需要,要录制1 个真人讲PPT的视频,作为典型I人,本人露面是不可能的。 于是打起了数字人…

二维码门楼牌管理应用平台建设:打造高效运维新生态

文章目录 前言一、系统运维概述二、菜单管理:个性化服务的关键三、参数管理:优化系统性能的关键四、字典管理:数据标准化的基石五、邮件管理:沟通协作的桥梁六、任务调度:自动化工作的核心七、短信管理:及时…

头发健康知识一

头发重要性: 头发是人第二张脸,影响人容貌 形象和气质.头皮基本结构 角质层,颗粒层,有挤层,基底层4个细胞层组成,含有大量毛囊和皮脂腺和汗腺.头屑是什么? 头屑为角质细胞的新陈代谢脱落的死细胞,每天都会有十几万角质细胞脱落 (正常的代谢周期为28天). 当基底层细胞受损时…

32.x86游戏实战-使用物品call

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

MySql审计平台

安装方式: cookieY/Yearning: 🐳 A most popular sql audit platform for mysql (github.com) 对数据库的一系列后台操作 AI助手 - AI助手提供SQL优化建议,帮助用户优化SQL语句,以获得更好的性能。同时AI助手还提供文本到SQL的…

手把手教你OpenCV常见滤波(高斯,中值,均值)C++

目录 1 图像处理中的高斯函数 1.1一维高斯函数 1.2二维高斯函数 1.3 代码 1.4 结果 2 低通滤波之均值滤波器 2.1、空间滤波基础 2.1.1线性空间滤波原理 2.1.2 相关与卷积 2.2、平滑滤波之均值滤波器 2.2.1原理 2.2.2 c opencv代码 2.2.3 结果 3 中值滤波 3.1 c …

LC 42.接雨水

42.接雨水 给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入: height [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 解释: 上面是由数组 [0,1,0,2,1,0,1,3…

临床随机对照试验中的分层问题及其解决方法

在临床随机对照试验(Randomized Controlled Trials, RCTs)中,分层问题(Stratification Issues)是影响研究结果有效性的重要因素之一。RCTs是评估医疗干预效果的金标准,旨在通过随机分组和对照来消除干扰因素…

PPP 协议分析(实验报告)

实验设备及软件 (1)硬件设备:PC 机或笔记本电脑;(2)软件:H3C Cloud Lab 实验环境配置 (1)实验拓扑图 (2)网络配置参数 Device Interface IP/…

基于JSP的家用电器销售网站

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:JSPJava 工具:ECLIPSE、MySQL数据库管理工具、Tomcat 系统展示 首页 个人中心 商品信…

华为od机试真题:内存冷热标记(Python)

2024华为OD机试(C卷D卷)最新题库【超值优惠】Java/Python/C合集 题目描述 现代计算机系统通常存在多级的存储设备,针对海量的 wordload 的优化的一种思路是将热点内存页优化先放到快速存储层级,这就需要对内存页进行冷热标记。 …

吴恩达机器学习WEEK2

COURSE1 WEEK2 多维特征 在线性回归中,往往特征不止一个,而是具有多维特征 例如,在预测房价的例子中,我们知道更多的信息: x 1 x_1 x1​:房屋的面积 x 2 x_2 x2​:卧室的数目 x 3 x_3 x3​&a…

天气预报仿写总结

目录 前言 首页 搜索页 详情页 浏览页 前言 这周学习了iOS中简单的网络请求,并完成了天气预报的仿写,这篇博客来做一下总结。天气预报主要要实现四个界面,接下来分四个界面分别讲解一下。 首页 首页的布局就是上方两个很简单的控件添加…

【人工智能基础三】卷积神经网络基础(CNN)

文章目录 1. 卷积神经网络结构2. 卷积神经网络计算2.1. 卷积层计算2.2. 池化层计算2.3. 全连接层计算 3. 典型卷积神经网络3.1. AlexNet3.2. VGGnet 卷积神经网络(Convolutional Neural Network,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Ne…

1、 window平台opencv下载编译, 基于cmake和QT工具链

1. 环境准备,源码下载 1.1 前置环境 qt 下载安装cmake 安装,可参考: https://blog.csdn.net/qq_51355375/article/details/139186681 1.2 opencv 源码下载 官网地址: https://opencv.org/releases/ 下载源码: 2 …

(2024,∞-Brush,无限维扩散,希尔伯特空间,超分辨率,跨注意力神经算子,线性注意)具有无限维度扩散模型的可控大图像合成

∞-Brush: Controllable Large Image Synthesis with Diffusion Models in Infinite Dimensions 目录 0. 摘要 1. 简介 2. 相关工作 4. 提出的方法 4.1 函数空间中的条件扩散模型 4.2 带有跨注意力神经算子的条件去噪器 5. 实验 6. 限制 7. 结论 0. 摘要 将复杂、特定…