文档章节

关于PostgreSQL的 Toast

吐槽的达达仔
 吐槽的达达仔
发布于 2017/03/27 20:57
字数 512
阅读 72
收藏 0

当一行数据的长度超过4K or 8K(根据配置),就会使用Toast,没办法关闭。

PostgreSQL uses a fixed page size (commonly 8 kB), and does not allow tuples to span multiple pages. 

也就是说,在安装postgresql的时候,就会指定block size,block size会指定page size的大小,当记录超过一个page size的时候,pg是不允许一行数据跨page存储,就会使用到toast。

 

SELECT

a.attrelid ,

a.attname AS NAME

,a.*

FROM

pg_class c,

pg_attribute a

WHERE

a.attrelid = c.oid

AND c.relname = 'dxy_web_event_test'; -- table name





SELECT a.attrelid ,

a.attname, pg_catalog.format_type(a.atttypid, a.atttypmod),

(SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)

FROM pg_catalog.pg_attrdef d

WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef),

a.attnotnull, a.attnum,

(SELECT c.collname FROM pg_catalog.pg_collation c, pg_catalog.pg_type t

WHERE c.oid = a.attcollation AND t.oid = a.atttypid AND a.attcollation <> t.typcollation) AS attcollation,

NULL AS indexdef,

NULL AS attfdwoptions,

a.attstorage,

CASE WHEN a.attstattarget=-1 THEN NULL ELSE a.attstattarget END AS attstattarget, pg_catalog.col_description(a.attrelid, a.attnum)

FROM pg_catalog.pg_attribute a

WHERE a.attnum > 0

AND NOT a.attisdropped

ORDER BY a.attnum;

 

p: Value must always be stored plain.

e: Value can be stored in a "secondary" relation (if relation has one, see pg_class.reltoastrelid).

m: Value can be stored compressed inline.

x: Value can be stored compressed inline or stored in "secondary" storage.

 

4种Toast策略:

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

 

 

https://www.qcloud.com/community/article/213

 

© 著作权归作者所有

吐槽的达达仔
粉丝 28
博文 104
码字总数 7105
作品 0
广州
程序员
私信 提问
PostgreSQL系统表及其TOAST是如何定义的

本文只是讲PG怎样定义系统表,而不是修改系统表甚至是定义自己的系统表。 PG系统表,比如:pg_class、pg_attribute、pg_type 等等 这几个表相互关联,后两者要在pg_class记录自己的表定义,而...

有理想的猪
07/19
15
0
PostgreSQL 11 preview - TOAST切片阈值表级可配置

标签 PostgreSQL , toast阈值表级动态设置 , 增强 , 11 背景 还记得我在13年的时候写过几篇关于变长字段优化的CASE,如果变长字段不怎么被更新,建议放到TOAST存储,因为放TOAST后,TUPLE中就...

德哥
2018/07/28
0
0
Postgres的TOAST技术

一、介绍 首先,Toast是一个名字缩写,全写是The OverSized Attribute Storage Technique,即超尺寸字段存储技术,顾名思义,是说超长字段在Postgres的一个存储方式。Postgres采用的存储默认...

kenyon_君羊
2013/03/11
3.3K
10
PostgreSQL 通过分割heap数据文件分拆表的hacking方法

标签 PostgreSQL , heap file , toast file , 分区 , split , 拆表 , 大表 背景 为什么要将一张大表拆成若干张小表?前面的文档给出了原因 《PostgreSQL 并行vacuum patch - 暨为什么需要并行...

德哥
2018/04/18
0
0
PostgreSQL学习手册(十三) 系统表

一、pg_class: 该系统表记录了数据表、索引(仍然需要参阅pg_index)、序列、视图、复合类型和一些特殊关系类型的元数据。注意:不是所有字段对所有对象类型都有意义。 名字 类型 引用 描述 re...

长平狐
2012/09/06
112
0

没有更多内容

加载失败,请刷新页面

加载更多

基于CentOS7搭建GitLab

基于CentOS7搭建GitLab 12018.11.02 16:38:51字数 959阅读 3791 本文作者:蓝雄威,叩丁狼高级讲师。原创文章,转载请注明出处。 一、简介 Git Lab GitLab是利用 Ruby on Rails 一个开源的版...

linjin200
17分钟前
4
0
random生成随机数

随机生成0到100之间的10个随机数,然后使用冒泡排序将这10个数按从小到大的顺序排序 生成10个随机数 import randomnum = range(0, 100) # 范围在0到100之间,需要用到range()函数。nums...

彩色泡泡糖
20分钟前
3
0
kubernetes 环境搭建 —— kubeadm

主从节点需要安装的服务 Master 节点 Node 节点 etcd-master Control plane(如:calico,fannel) kube-apiserver kube-proxy kube-controller-manager other apps kube-dns Control plane(如:......

lemos
23分钟前
4
0
php将字符串中的中英文数字分割

$str = "php如何将字 符串中322的字母数字Asf f45d和中文_分割?"; $arr = preg_split("/([a-zA-Z0-9]+)/", $str, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); print_r($arr); Arr......

小小小壮
23分钟前
3
0
茑屋书店理解(一)

说到实体书店,你可能会想到两个字“难做”。一是电子书大为盛行,二是纸书作为标准品,完全可以在网上购买,因此国内许多实体书店的日子是举步维艰。但是在日本有这么一家实体书店,目前已经...

Idea
27分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部