首页 > 其他分享 >TOAST技术

TOAST技术

时间:2024-08-20 22:51:40浏览次数:12  
标签:TOAST toast 存储 chunk 技术 行外 pg

https://cloud.tencent.com/developer/article/1004455

什么是TOAST技术

TOAST是The Oversized-Attribute Storage Technique的缩写,即行外存储,主要用于存储大字段的值。由于PostgreSQL块的大小是固定的(通常是8KB),且不允许行跨越多个页面,因此不可能存储非常大的字段值。为了突破这个限制,大的字段值通常被压缩或者切片成多个物理行存储到另一张系统表中,即TOAST表。只有特定的数据类型支持TOAST技术,整数、浮点等不太长的数据类型没必要使用TOAST技术。另外,支持TOAST技术的数据类型必须是变长的。

长度字

在变长类型中前4个字节(32bit)称为长度字,长度字后面存储的是具体内容或指针。

长度字的高2bit是标志位,后面的30位是长度值。由此可见TOAST数据类型的逻辑长度最多是30bit,即1GB之内(2^30 - 1)。

前2bit一个表示是否压缩,一个表示是否行外存储,如果两个都是0则表示该字段值既未被压缩也没有行外存储。如果设置了第一位则表示该数值被压缩过,使用前必须解压。如果设置了另外一位,则表示使用的是行外存储。此时长度字后面的部分只是一个指针,指向存储实际数据的TOAST表的位置。如果两个都设置了,那么这个行外数据也被压缩过了。不管哪种情况,长度字里剩下的30bit的长度值都表示数据的实际尺寸,而不是压缩过的数据长度。

只有当数据长度超过2040字节(大约一个块的四分之一)时才会触发压缩。在PostgreSQL 11之后可以通过toast_tuple_target参数来改变这个值的大小

alter table test01 set(toast_tuple_target=128);

如果没有使用行外存储则长度字后面的内容则是该字段具体的值

TOAST 的策略

  • PLAIN :避免压缩和行外存储。只有那些不需要 TOAST 策略就能存放的数据类型允许选择(例如 int 类型),而对于 text 这类要求存储长度超过页大小的类型,是不允许采用此策略的
  • EXTENDED :允许压缩和行外存储。一般会先压缩,如果还是太大,就会行外存储
  • EXTERNA :允许行外存储,但不许压缩。类似字符串这种会对数据的一部分进行操作的字段,采用此策略可能获得更高的性能,因为不需要读取出整行数据再解压。
  • MAIN :允许压缩,但不许行外存储。不过实际上,为了保证过大数据的存储,行外存储在其它方式(例如压缩)都无法满足需求的情况下,作为最后手段还是会被启动。因此理解为:尽量不使用行外存储更贴切。

例子

创建一张 blog 表

testdb=# create table blog(id int, title text, content text);
CREATE TABLE

testdb=# \d+ blog ;
                                           Table "public.blog"
 Column  |  Type   | Collation | Nullable | Default | Storage  | Compression | Stats target | Description 
---------+---------+-----------+----------+---------+----------+-------------+--------------+-------------
 id      | integer |           |          |         | plain    |             |              | 
 title   | text    |           |          |         | extended |             |              | 
 content | text    |           |          |         | extended |             |              | 
Access method: heap

可以看到,interger 默认 TOAST 策略为 plain ,而 text 为 extended 。PG 资料告诉我们,如果表中有字段需要 TOAST ,
那么系统会自动创建一张 TOAST 表负责行外存储,那么这张表在哪里?

testdb=# select relname,relfilenode,reltoastrelid from pg_class where relname='blog';
 relname | relfilenode | reltoastrelid 
---------+-------------+---------------
 blog    |       16432 |         16435
(1 row)

通过上面语句,我们查到 blog 表的 oid 为16432,其对应 TOAST 表的 oid 为16435,
那么其对应 TOAST 表名则为: pg_toast.pg_toast_16432(注意这里是 blog 表的 oid ),我们看下其定义:

testdb=# \d+ pg_toast.pg_toast_16432;
TOAST table "pg_toast.pg_toast_16432"
   Column   |  Type   | Storage 
------------+---------+---------
 chunk_id   | oid     | plain
 chunk_seq  | integer | plain
 chunk_data | bytea   | plain
Owning table: "public.blog"
Indexes:
    "pg_toast_16432_index" PRIMARY KEY, btree (chunk_id, chunk_seq)
Access method: heap

TOAST 表有3个字段:

chunk_id :用来表示特定 TOAST 值的 OID ,可以理解为具有同样 chunk_id 值的所有行组成原表(这里的 blog )的 TOAST 字段的一行数据

chunk_seq :用来表示该行数据在整个数据中的位置

chunk_data :实际存储的数据。

 

插入数据

testdb=# insert into blog values(1, 'title', '0123456789');
INSERT 0 1
testdb=# select * from blog;
 id | title |  content   
----+-------+------------
  1 | title | 0123456789
(1 row)

--- 此时toast表中没有数据
testdb=# select * from pg_toast.pg_toast_16432;
 chunk_id | chunk_seq | chunk_data 
----------+-----------+------------
(0 rows)

testdb=# update blog set content=content||content where id=1;
UPDATE 1

--- 反复执行如上过程,直到 pg_toast_16441 表中有数据:
testdb=# select chunk_id,chunk_seq,length(chunk_data) from pg_toast.pg_toast_16432;
 chunk_id | chunk_seq | length 
----------+-----------+--------
    16439 |         0 |   1996
    16439 |         1 |   1996
    16439 |         2 |   1996
    16439 |         3 |   1996
    16439 |         4 |   1996
    16439 |         5 |   1996
    16439 |         6 |   1996
    16439 |         7 |   1050
(8 rows)

 可以看到,直到 content 的长度为327680时(已远远超过页大小 8K),对应 TOAST 表中才有了2行数据,且长度都是略小于2K,这是因为 extended 策略下,先启用了压缩,然后才使用行外存储。

 

下面我们将 content 的 TOAST 策略改为 EXTERNA ,以禁止压缩。

 

标签:TOAST,toast,存储,chunk,技术,行外,pg
From: https://www.cnblogs.com/gavin-zheng/p/18370355

相关文章

  • 利用缓存优化网络性能:技术、策略与实践
    摘要缓存是提高网络性能的重要技术之一,它通过减少数据加载时间、降低服务器负载和网络带宽消耗,从而加速内容的交付速度。本文将详细探讨缓存的工作原理、不同类型的缓存机制、以及如何在Web开发和网络架构中有效利用缓存。1.缓存的基本概念缓存是一种将数据暂存的技术,以......
  • SQL非技术快速入门39题
    ※食用指南:文章内容为牛客网《非技术快速入门》39道题重点笔记,用于重复思考错题,加深印象。练习传送门:SQL非技术快速入门39题目录:SQL13Wherein和NotinSQL19分组过滤练习题SQL20 分组排序练习题SQL22 统计每个学校的答过题的用户的平均答题数SQL24 统计每个用户......
  • 讯飞星火极速超拟人交互技术:语音端到端,8 月底开放;昆仑万维发布 AI 短剧平台 SkyReels
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观......
  • 一汽集团数据专家分享:实时数据技术在汽车行业的应用与实践经验
    【导读】在当今快速变化的商业环境中,数据的实时性和准确性是企业制胜的关键。然而,数据孤岛、数据分散、处理时效差等难题却成为制约企业发展的瓶颈。本文将围绕实时数据技术在汽车行业的应用与实践经验分享展开。本次分享主要涵盖三个方面展开。第一,关于数据技术的起源以及其与......
  • 【目标检测】Transformers在小目标检测中的应用:最新技术的基准测试和调查
    《TransformersinSmallObjectDetection:ABenchmarkandSurveyofState-of-the-Art》Transformers在小目标检测中的应用:最新技术的基准测试和调查原文:https://arxiv.org/abs/2309.049021研究背景和目的小目标检测(SOD)对现有目标检测方法具有挑战性,而Transformer......
  • 《2024智慧超矫技术白皮书》
    在全球制造业转型升级的大潮中,金属板材矫平行业正在经历一场深刻的技术变革。作为这一领域的领军企业,玛哈特集团发布了《2024智慧超矫技术白皮书》,深入剖析当前行业所面临的挑战与机遇,展示智慧超矫技术在提升生产效率、降低成本和优化产品质量方面的巨大潜力。01行业变迁中的......
  • 玛哈特发布《2024智慧超矫技术白皮书》 引领金属板材矫平行业的智能化变革
    随着全球制造业对高精度和高效率的需求日益增长,金属板材矫平技术正经历着一场前所未有的变革。玛哈特集团顺应这一趋势,隆重发布了《2024智慧超矫技术白皮书》。该白皮书深入探讨了智慧超矫技术在金属板材矫平中的应用,展示了该技术如何为企业提供更高效、更精确的解决方案,从而帮......
  • 储能技术对虚拟电厂影响
    引言在能源转型的大潮中,虚拟电厂作为智能电网的重要组成部分,正逐渐展现出其巨大的潜力和价值。而储能技术,作为虚拟电厂的“能量蓄水池”,正深刻改变着能源的生产、存储和分配方式。1储能技术概述1.1储能技术的定义与分类储能技术,简而言之,就是将电能、热能、化学能等形式的......
  • 【轨物洞见】找到技术创新的“真问题”
    技术创新是用技术解决真问题,创造真价值。问题是需求,技术是供应,将需求与供应有效连接的能力,是创新力。技术创新的第一步在于找到“真问题”。在找问题之前,我们先了解一下问题是如何产生的。问题就是期望值与现状之间落差。找问题首先要了解对方的需求、期望,接着要搞清楚现状,......
  • 【数据库干货汇总】2024年上半年墨天轮最受欢迎的40篇技术文章+文档
    作为数据库领域的专业社区,墨天轮社区上汇聚了众多优秀的技术专家与一线从业者,他们积极参与社区共建,通过文章、文档分享了自己的工作实践与学习经验。小编综合阅读量、点赞量、收藏数、下载数等指标,从2024年1月1日-6月30日众多的内容中筛选出20篇优质文章、20篇优质文档,涵盖Oracle......