PostgreSQL(二十三)TOAST技术
目录
一、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做的稍好一些。
相关文章:
PostgreSQL(二十三)TOAST技术
目录 一、TOAST简介 二、TOAST的存储方式 1、存储方式概述 2、实验:创建TOAST表 三、TOAST的4种压缩策略 1、策略说明 2、TOAST表额外的三个字段 四、TOAST表的计算方式 1、说明 2、实验:计算表大小 五、TOAST表的特点 1、优点 2、缺点 3、…...
文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《海上风氢系统与沿海电网能量协同优化调度》
本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...
MySQL update set语句中 逗号与and的区别
语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法: UPDATE table_name SET column1 value1, column2 value2, ... WHERE condition; 参数说明: table_name 是你要更新数据的表的名称。column1, column2, ... 是你要更新的列的名称。v…...
C++面试---小米
一、static 关键字的作用,及和const的区别 static关键字作用: 1、在类的成员变量前使用,表示该变量属于类本身,而不是任何类的实例。 2、在类的成员函数前使用,表示该函数不需要对象实例即可调用,且只能访问…...
Java 实现 AVL树
在二叉平衡树中,我们进行插入和删除操作时都需要遍历树,可见树的结构是很影响操作效率的。在最坏的情况下,树成了一个单支树,查找的时间复杂度成了O(N),建树跟没建树一样。那么是不是有什么办法可以建一个树避免这种情…...
CNN卷积网络实现MNIST数据集手写数字识别
步骤一:加载MNIST数据集 train_data MNIST(root./data,trainTrue,downloadFalse,transformtransforms.ToTensor()) train_loader DataLoader(train_data,shuffleTrue,batch_size64) # 测试数据集 test_data MNIST(root./data,trainFalse,downloadFalse,transfor…...
深入理解Java中的时间处理与时区管理
在Java开发中,时间处理和时区管理是常见的需求,特别是在全球化应用中。Java 8引入了新的时间API(java.time包),使时间处理变得更加直观和高效。本文将详细介绍Java中的时间处理与时区管理,通过丰富的代码示…...
虚拟机windows server创建域
目录 准备工作 一、新建域控制器 二、提升为域控制器添加新林 三、新建组织单位(OU),用户 四、将计算机加域 五、在域控中管理计算机 六、在域控中配置组策略 七、域内计算机验证组策略配置 准备工作 安装域前,如果有DNS…...
Java 集合框架:Java 中的 Set 集合(HashSet LinkedHashSet TreeSet)特点与实现解析
大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 017 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…...
springboot智能健康管理平台-计算机毕业设计源码57256
摘要 在当今社会,人们越来越重视健康饮食和健康管理。借助SpringBoot框架和MySQL数据库的支持,开发智能健康管理平台成为可能。该平台结合了小程序技术的便利性和SpringBoot框架的快速开发能力,为用户提供了便捷的健康管理解决方案。 通过智能…...
LetterBox图像预处理方法
LetterBox图像预处理方法就是要将不同分辨率的图像转换成固定分辨率,比如v8输入网络的固定分辨率为6406403,因此这里分享一下默认情况下对训练集、验证集和测试图片做的letterBox的方法。 1.LetterBox-Train 对于训练集,默认输入网络的图像尺寸为640640,假设有一张7201280…...
C++第五篇 类和对象(下) 初始化列表
目录 1.再探构造函数 2.类型转换 3.static成员 4.友元 friiend 1.再探构造函数 (1).之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表的使用方式是以一个冒…...
C#中的通信
上位机应用开发-串口通信1、基于C#的串口通信对象:SerialPort 2、字段属性 PortName:获取或设置通信端口 BaudRate:获取或设置串行波特率-DataBits:获取或设置每个字节的标准数据位长度 Parity:获取或设置奇偶校验检查协仪I-StopBits;获取或设置每个字节的标准停止位数 3、…...
CVE-2022-21663: WordPress <5.8.3 版本对象注入漏洞深入分析
引言 在网络安全领域,技术的研究与讨论是不断进步的动力。本文针对WordPress的一个对象注入漏洞进行分析,旨在分享技术细节并提醒安全的重要性。特别强调:本文内容仅限技术研究,严禁用于非法目的。 漏洞背景 继WordPress CVE-2…...
C语言笔试题(三)
本专栏通过整理各专业方向的面试资料并咨询业界相关人士,整合不同方向的面试资料,希望能为您的面试道路点亮一盏灯! 1 简单题 如何声明一个二维数组? 答案: int arr[3][4];解析: 二维数组可以看作数组的数组。 union和struct…...
minio笔记之windows下安装使用
minio安装使用 去官网下载安装包启动访问管理平台创建桶创建用户、资源授权访问访问策略创建创建用户创建accessKey,用于应用程序开发 去官网下载安装包 直接安装即可 启动 设置密码 set MINIO_ROOT_USERadmin set MINIO_ROOT_PASSWORD12345678 cd到安装目录 mi…...
代码随想录算法训练营day31 | 56. 合并区间、738.单调递增的数字
碎碎念:加油 参考:代码随想录 56. 合并区间 题目链接 56. 合并区间 思想 这道题的核心还是判断重叠区间,本题和之前做过的452. 用最少数量的箭引爆气球、435. 无重叠区间的区别在于判断出重叠区间之后的操作,本题需要做的是合…...
利用 Python 制作图片轮播应用
在这篇博客中,我将向大家展示如何使用 xPython 创建一个图片轮播应用。这个应用能够从指定文件夹中加载图片,定时轮播,并提供按钮来保存当前图片到收藏夹或仅轮播收藏夹中的图片。我们还将实现退出按钮和全屏显示的功能。 C:\pythoncode\new\…...
报表系统之Cube.js
Cube.js 是一个开源的分析框架,专为构建数据应用和分析工具而设计。它的主要目的是简化和加速构建复杂的分析和数据可视化应用。以下是对 Cube.js 的详细介绍: 核心功能和特点 1. 多数据源支持 Cube.js 支持从多个数据源中提取数据,包括 SQ…...
代码随想录算法训练营第45天
115.不同的子序列 但相对于刚讲过 392.判断子序列,本题 就有难度了 ,感受一下本题和 392.判断子序列 的区别。 代码随想录 class Solution {public int numDistinct(String s, String t) {int lenS s.length();int lenT t.length();int[][] dp new …...
solidity合约创建
合约可以通过使用new关键字来创建其他合约的实例。 这个过程会执行被创建合约的构造函数(如果存在的话),并返回一个指向新创建合约的地址的引用。 这种方式允许智能合约动态地在区块链上部署新合约,并与它们交互。 通过 new 创…...
队列---循环队列实现
循环队列详解 概述 循环队列是一种基于数组实现的队列数据结构,其中队列的队首和队尾是通过模运算连接起来形成一个逻辑上的环形结构。这样可以有效地利用数组的空间,避免出现“假溢出”的情况。 结构体定义 循环队列的结构体定义如下: …...
【视频讲解】后端增删改查接口有什么用?
B站视频地址 B站视频地址 前言 “后端增删改查接口有什么用”,其实这句话可以拆解为下面3个问题。 接口是什么意思?后端接口是什么意思?后端接口中的增删改查接口有什么用? 1、接口 概念:接口的概念在不同的领域中…...
双指针hard题
[LeetCode]4. Median of Two Sorted Arrays 中文 - YouTube 依赖merge sort和priorityqueue的废物 正式变身山景城一姐小迷妹✪ω✪ 寻找正序数组中位数 class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int len1 nums1.length;int len2 …...
前端实现【 批量任务调度管理器 】demo优化
一、前提介绍 我在前文实现过一个【批量任务调度管理器】的 demo,能实现简单的任务批量并发分组,过滤等操作。但是还有很多优化空间,所以查找一些优化的库, 主要想优化两个方面, 上篇提到的: 针对 3&…...
【数据结构】包装类和泛型
🎉欢迎大家收看,请多多支持🌹 🥰关注小哇,和我一起成长🚀个人主页🚀 ⭐在更专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ 👑目录 包装类🌙 ⭐基本类型对应的包…...
浅学爬虫-数据存储
在数据爬取完成后,我们需要将数据存储起来,以便于后续的分析和处理。常见的数据存储方式包括存储到CSV文件和存储到数据库。下面我们详细介绍如何实现这些存储方式。 存储到CSV CSV(Comma-Separated Values)文件是一种常用的文本…...
十六、maven git-快速上手(智慧云教育平台)
🌻🌻 目录 一、概述及项目管理工具介绍1.1 项目介绍1.2 maven 介绍及其配置1.2.1 maven 介绍1.2.2 maven 下载与配置 1.3 pom 中常见标签的使用1.4 后端项目环境的搭建1.5 Git 简介1.6 Git 的基本使用1.6.1 码云的注册与仓库创建1.6.2 上传代码到码云仓库…...
chrome/edge浏览器插件开发入门与加载使用
同学们可以私信我加入学习群! 正文开始 前言一、插件与普通前端项目二、开发插件——manifest.json三、插件使用edge浏览器中使用/加载插件chrome浏览器中使用/加载插件 总结 前言 chrome插件的出现,初衷可能是为了方便用户更好地控制浏览器,…...
【完美解决】 TypeError: ‘str’ object does not support item assignment
【完美解决】 TypeError: ‘str’ object does not support item assignment 在Python编程中,遇到TypeError: str object does not support item assignment这样的错误通常意味着你试图修改字符串中的某个字符,但字符串是不可变类型,不支持这…...
商城网站建设价格最优/如何做电商
性能:深度探索捕获列表处理解析结论脚注从 GitHub 或者 zipped 获取本文相关的 Playground 代码。然后从这 里获取闭包案例和 SIL,SILGen 以及 LLVM IR 的输出。从 GitHub 或者 zipped 获取本文相关的 Playground 代码。然后从这 里获取闭包案例和 SIL&a…...
专业网站建设多少钱/百度保障客服电话
为什么80%的码农都做不了架构师?>>> 一 、登录 时序图如下: wx.login() 获取js_code 示例代码: App({ onLaunch: function() { wx.login({ success: function(res) { if (res.code) { //TODO } else { console.log(获取用户登录态…...
foxmail网站邮箱/附子seo教程
此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步 https://github.com/Javen205/IJPay http://git.oschina.net/javen205/IJPay 我们接着上一篇文章支付宝支付-刷卡支付(条码支付)详解 继续来聊聊支付包扫码支付 1、场景介绍 扫码支付,指用户打开支付…...
专卖衣服的购物平台/拼多多seo是什么意思
本文主要介绍git分支的概念及常用分支操作。 分支的概念 所谓分支,可以理解成一个个相互独立的工作空间,在每一个分支上的改动不会影响到其他分支的代码。git默认的分支是master分支。 试想一下这样一个场景: 正在master分支写主干需求的代码…...
常见购物网站功能/运营推广是做什么的
public static int singleNumber(int[] nums) {int res 0;for(int i0;i<nums.length;i)res ^ nums[i];return res;}...
2016广州网站设计公司/销售管理怎么带团队
市面上有海量的软件开发工具,因此,选择最佳软件开发工具可能是一项挑战。本文是 10款顶级软件开发工具的精选列表。01LinxLinx 是一款低代码的 IDE 和服务器。IT 专业人员使用 Linx 可以快速创建自定义的自动化业务流程、集成应用程序、公开 Web 服务&am…...