postgresql_internals-14 学习笔记(四)TOAST 超尺寸字段存储技术

news2024/11/17 9:50:39

        TOAST之前一直没太弄懂,这一节单独拆出来学习。

一、 引入原因

       pg中的每个行只能存在一个page里,不能跨page存储。因此对于一些非常长的行,就需要使用到 TOAST(The OverSized Attribute Storage Technique,超尺寸字段存储技术)将大字段值压缩或者拆分为多行到单独表存储。对于用户来说,这是完全透明的。

二、 TOAST策略

1. 多长算超尺寸

       一般来说,pg的目标是在每个页中(8K)至少存4个行,因此如果单行大小超过页的1/4大小(2K),就会对其中的字段使用TOAST策略,也可以在表级设置 toast_tuple_threshold参数(默认2K)自行调整。

2. 4种策略

TOAST有2个大方向处理表中超长的行 —— 压缩、行外存储。

根据倾向程度不同,又分为4种策略:

  • PLAIN:不使用TOAST,即禁止压缩和行外存储。只有真的不需要使用TOAST的数据类型才可以选此策略,例如 int,date,boolean等。
  • MAIN:优先压缩,尽量不用行外存储。只有在压缩后行内容还是超长时,才会使用行外存储。
  • EXTENDED:允许压缩和行外存储。一般也会先压缩,但不像MAIN策略要求严格。
  • EXTERNAL:只行外存储,不压缩。对于读取部分字符串类型的操作,一般这种策略性能会更高,因为不需要整行压缩再解压。

可以自己定义用哪种策略

ALTER TABLE 表名 ALTER COLUMN 列名 SET STORAGE external;

例如:

create table t(a int,b numeric,c text,d json);

SELECT attname, atttypid::regtype,
CASE attstorage
WHEN 'p' THEN 'plain'
WHEN 'e' THEN 'external'
WHEN 'm' THEN 'main'
WHEN 'x' THEN 'extended'
END AS storage
FROM pg_attribute
WHERE attrelid = 't'::regclass AND attnum > 0;

ALTER TABLE t ALTER COLUMN d SET STORAGE external;

       对于索引,TOAST只支持压缩,不支持行外存储。因此,通常数据库对索引字段长度都是有限制的。

3. 处理流程

  • 首先处理externalextended策略的字段,从最长的字段开始。extended策略会先压缩,如果压缩后长度还超过2K,则将其移到TOAST表单独存储。external策略则不压缩,直接将其移到TOAST表单独存储。
  • 如果经过第一步后,TOAST表中的行仍然超长,pg会TOAST表中的行循环执行第一步,直到长度小于toast_tuple_target表级参数(默认也是2K)。
  • 如果行还超长,接下来会处理main策略字段,压缩以使其尽量放在原表中。
  • 如果还是超长,压缩后的main策略字段也会移到TOAST表单独存储。

三、 TOAST

       支持TOAST的数据类型应当是可变长度的 variable-length。

       TOAST表均位于pg_toast schema下,它默认不在search_path中,因此TOAST表通常是隐藏的。对于临时TOAST表 pg_temp_N,则位于pg_toast_temp_N schema下,一一对应。

SELECT relnamespace::regnamespace, relname 
FROM pg_class WHERE oid = (SELECT reltoastrelid FROM pg_class WHERE relname = 't');

\d+ pg_toast.pg_toast_16523

  • chunk_id:标识toast表的oid字段
  • chunk_seqchunk的序列号,与chunk_id组成主键pg_toast_16523_index,加速访问toast表
  • chunk_data:存储toast表实际数据

来插入一些数据

insert into t(c) values(repeat('A',5000));

select * from  pg_toast.pg_toast_16523;

toast表中没有结果,说明处理后没有超长(因为全是A非常好压缩)

这次换成难以压缩的随机字符

UPDATE t SET c = (SELECT string_agg( chr(trunc(65+random()*26)::integer), '') FROM generate_series(1,5000)) RETURNING left(c,10) || '...' || right(c,10);

SELECT chunk_id,chunk_seq,length(chunk_data),
left(encode(chunk_data,'escape')::text, 10) || '...' || right(encode(chunk_data,'escape')::text, 10)
FROM pg_toast.pg_toast_16523;

可以看到,这次有结果了,pg将它拆成了3行才存下。

四、 表大小计算

        对于用到了toast的表,原表大小可能只占实际很小的一部分,需要加上行外存储,索引也一样。

仅查看表大小(单位MB,不包括索引和toast)

select pg_size_pretty(pg_relation_size('表名'));

表+索引+toast 大小

select pg_size_pretty(pg_total_relation_size('表名'));

表+toast 大小

psql命令版

\dt+ tab_name

等价于

select pg_size_pretty(pg_table_size('表名'));

分类查询大小

SELECT *, 
       Pg_size_pretty(total_bytes) AS total, 
       Pg_size_pretty(index_bytes) AS index, 
       Pg_size_pretty(toast_bytes) AS toast, 
       Pg_size_pretty(table_bytes) AS table 
FROM   (SELECT *, 
               total_bytes - index_bytes - Coalesce(toast_bytes, 0) AS 
               table_bytes 
        FROM   (SELECT c.oid, 
                       nspname                               AS table_schema, 
                       relname                               AS TABLE_NAME, 
                       c.reltuples                           AS row_estimate, 
                       Pg_total_relation_size(c.oid)         AS total_bytes, 
                       Pg_indexes_size(c.oid)                AS index_bytes, 
                       Pg_total_relation_size(reltoastrelid) AS toast_bytes 
                FROM   pg_class c 
                       LEFT JOIN pg_namespace n 
                              ON n.oid = c.relnamespace 
                WHERE  relkind = 'r') a 
        WHERE  table_schema = 'public' 
        ORDER  BY total_bytes DESC) a;

五、 TOAST优缺点

1. 优点

  • 可以存储超长超大字段,避免之前不能直接存储的限制
  • 物理上与普通表是分离的,查询、更新不涉及到Toast字段时会极大加快速度,快于未使用Toast的中等字段,因为实际它处理的数据更少

2. 缺点

  1. Toast字段的索引创建有可能会失败,且通常不建议,全文检索是一个解决方案
  2. Toast字段的查询、更新效率还是较低,其它DB也存在相同问题,因此并不建议将非常长的数据存入数据库

参考

PGCE课程《TOAST技术》

https://mp.weixin.qq.com/s?__biz=MzUyOTAyMzMyNg==&mid=2247488278&idx=1&sn=673b883bee4ed7db812949cfb2ae9618&chksm=fa663b27cd11b2316570e6f5e7c293fc2f383ac91db2fc4b7a915d6e5a32fad778cadb368d50&mpshare=1&scene=1&srcid=1124847gcWeTT0UlmMBiAPbA&sharer_sharetime=1669301108667&sharer_shareid=1a32625a0cee9a1f3987aa62eea3fa03&exportkey=n_ChQIAhIQo87cU%2FyB9UHGhNCHePLplRKZAgIE97dBBAEAAAAAAMMPLiyt3VwAAAAOpnltbLcz9gKNyK89dVj0LzgT0MDt8zRP7qF%2BoxzLY5qT%2B296V2kFZeqV7itcqXOwhFp2dgBIkHLfZmA7U3ReGiVPIUwcvNjJWbbQ%2FlUUajMW26SVYPeA1dSrBaXwZdqv8nx4H7uk2oAcV4zuX2bNgu6qFZawx4UMREksEcmQB7C5lT4%2Fp8GxLHgZ8z4vFmmEAAnzh%2BwwaQq4K93FSGdLdi6afqvyuQVV1MaFFIHPGu4gaJOxT%2BsO%2FXC4zheXpjwrgO%2FhaZ4qk5wLfUvfecHIyz1xc8jDopaVMclixgbBg1dUaiF3lKf%2FDPqvnN4dndxAUE8PzeNF5xDzwAopOslaQznk&acctmode=0&pass_ticket=kzk5I%2BXZvqEw9TUp7%2FycXwF%2FSduQOq0Ws1QstZUUyGEdRUvjLiasoIjsJUjggk8wjYTUvNFzkouGxnKhQ%2BOxVA%3D%3D&wx_header=0#rd

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

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

相关文章

import sklearn出现报错,如何正确安装sklearn

目录 一:前言 二:解决方法 三:测试是否成功安装 一:前言 博主最早只使用下面安装命令,安装sklearn pip3 install sklearn -i https://pypi.mirrors.ustc.edu.cn/simple/ 但在pycharm编辑器,导入sklearn模…

更合理的 BBR

BBR 倾向于排空队列,甚至用特殊的 ProbeRTT 状态来排空自己产生的队列以测量 RTT,但这并不现实。一言以蔽之,BBR 无法实时跟踪现状,只靠拢理想。 若因背景流量造成 buffer 抖动,BBR 完全无法应对,其运行状…

手撕B树 | 二三查找树,B+树B*树你都会了吗? | 超详细的数据结构保姆级别实现

说在前面 今天给大家带来B树系列数据结构的讲解! 博主为了这篇博客,做了很多准备,试了很多画图软件,就是为了让大家看得明白!希望大家不要吝啬一键三连啊!! 前言 那么这里博主先安利一下一些…

C语言百日刷题第十六天

前言 今天是刷题第16天,放弃不难,但坚持一定很酷~ 五套C语言验报告题 C语言百日刷题第十六天前言试验报告(一)试验报告(二)分析功能编写程序试验报告(三)分析功能编写程序试验报…

自定义图表--随意拖拽拉伸功能的实现

随意拖拽、拉伸元素的功能是现在大热的自定义图表的重要组成功能,本文以最简单的视角搞懂随意拖拽、拉伸元素功能,完成这个功能需要先了解原生 drag && vue-ruler-tool && @smallwei/avue demo在线体验地址:zhao-wenchao110.gitee.io/customdrag 一、了解H…

高并发内存池

"花,就在火海里摇曳开着。" 一、技术介绍 (1)什么是池化技术? 池 是在计算机技术中经常使用的一种设计模式,其内涵在于:将程序中需要经常使用的核心资源先申请出来,放到一个池内,由程序自己管理。这样可以提高资源的使…

【单调栈】接雨水

文章目录双指针动态规划单调栈双指针 每一列雨水的高度&#xff0c;取决于该列 min(左侧最高的柱子高度&#xff0c;右侧最高的柱子高度) - 当前柱子高度 class Solution { public:int trap(vector<int>& height) {int n height.size();int ans 0;for(int i 1; …

ZY_BMP280大气压模块的使用和程序

在搞设计时&#xff0c;用到了大气压模块BMP280&#xff0c;这玩意也不难&#xff0c;主要是淘宝店老板特别der一问三不知&#xff0c;真服了&#xff0c;而且资料里面没有给例程&#xff0c;只有51的例程&#xff0c;利用IIC通信&#xff0c;而且给的例程里面&#xff0c;乱七…

数据库实验五:数据库设计实验

实验五 数据库设计实验 1.实验目的 ​ 掌握数据库设计基本方法及数据库设计工具。 2.实验内容和要求 ​ 掌握数据库设计基本步骤&#xff0c;包括数据库概念结构设计、逻辑结构设计&#xff0c;物理结构设计&#xff0c;数据库模式SQL语句生成。能够使用数据库设计工具进行…

ctf笔记:编码

常见编码 博客链接&#xff1a;https://www.blog.23day.site/articles/76 计算机中的数据都是按字节存储。一个字节(Byte)由8个二进制位组成(bit)。&#xff08;组成范围是0~255(28))一个字节一共可以用来表示256种不同的状态&#xff0c;每一个状态对应一个符号&#xff0c;就…

推荐系统学习笔记-隐语义模型

由来 该算法最早在文本挖掘领域被提出&#xff0c;用于找到文本的隐含语义。 核心思想是通过隐含特征(latent factor) 联系用户兴趣和物品。 参数 f&#xff1a;隐向量维度&#xff0c;决定隐向量表达能力强弱 n&#xff1a;用户数 m&#xff1a;物品数 求解方法&#xff1a;…

ADI Blackfin DSP处理器-BF533的开发详解57:DSP控制ADV7180采集图像到LCD显示(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了采集一帧 720625 尺寸的 P 制 CVBS 信号源&#xff0c;以 YUYV422 的数据格式保存&#xff0c;通过 MDMA 将奇偶场数据交…

【轻松掌握C语言】文件操作

目录 一、为什么使用文件&#xff1f; 二、什么是文件&#xff1f; 1、程序文件 2、数据文件 3、文件名 三、文件操作 1、文件指针 2、文件打开与关闭 . 3、文件的顺序读写 4、文件的随机读写 5、文本文件和二进制文件 6、文件读取结束判定 四、文件缓冲区 一、…

C++ Reference: Standard C++ Library reference: Containers: map: map: rbegin

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/rbegin/ 公有成员函数 <map> std::map::rbegin C98 reverse_iterator rbegin(); const_reverse_iterator rbegin() const; C11 reverse_iterator rbegin() noexcept; const_reverse_iterator rbegin(…

这个大力神杯,梅西已足足等了16年,AI预测:阿根廷冠军

潘帕斯雄鹰和高卢雄鸡的决战&#xff0c;在三十多小时后即将上演。AI预测&#xff1a;胜率接近&#xff0c;阿根廷略高。 12月18日&#xff0c;卡塔尔世界杯总决赛将正式开战。 由卫冕军法国对上寻求队史第三冠的阿根廷&#xff0c;同时也是两位顶尖球星兼巴黎圣日耳曼队友梅…

LeetCode | 二叉树高频面试算法题汇总【速来】

小伙子&#xff0c;来给我✍棵树【LeetCode】144.二叉树的前序遍历C版本C语言版本&#xff08;递归算法展开图&#xff09;【LeetCode】94.二叉树的中序遍历C版本C语言版本【LeetCode】145.二叉树的后序遍历C版本C语言版本【LeetCode】102.二叉树的层序遍历DSF——深度优先搜索…

Linux 之centos7:一、Linux安装

Linux 之centos7 1.Linux简介 ​ Linux内核最初只是由芬兰人李纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 ​ Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支持多…

C#,基于视频的目标识别算法(Moving Object Detection)的原理、挑战及其应用

本文概述了基于监控视频之连续帧信息的各种目标识别算法及其存在的问题与挑战&#xff0c;结合实际应用开发的工作&#xff0c;文中给出了实验性基于帧差算法和改进型背景算法的非人工智能目标识别算法的实际效果。 目标识别算法一直并将持续成为人工智能研究与应用的重点&…

交换机设备上的G口、F口、E口、S口区别是什么?一台交换机有哪些接口呢?每个接口都有哪些作用?

交换机设备上的G口、F口、E口、S口区别是什么? 一台交换机有哪些接口呢?每个接口都有哪些作用? 交换机的主要功能包括:学习功能、转发过滤和消除回路。 学习功能:以太网交换机知道连接到每个端口的设备的MAC地址,将该地址与相应的端口进行映射,并存储在交换机缓存的MA…

jsp+ssm计算机毕业设计大学生互助系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…