toast简介
PostgreSQL数据库不允许元组(行,记录)跨越多个页面(page)存储,所以,它不能直接存储非常大的字段值。对于大字段值,它将被压缩且(或)分解为多个物理行,该技术称为“TOAST”。
toast技术特点
- toast是超长字段在PG的一个存储方式;
- 全称The overSized Attribute Stroage Technique(超尺寸字段存储技术);
- 它会将大字段值压缩或者分散为多个物理行来存储;
- 对于用户来说不用关注这一技术实现,完全是透明的;
toast的存储方式
- pg的部分类型数据支持toast,因为有些字段类型是不会产生大字段数据(比如date,time,boolean);
- 支持toast的数据类型应当是可变长度的(variable-length);
- 表中任何一个字段有toast,这个表都会有一个相关联的toast表,oid被存储在pg_class.reltoastrelid里;
- 超出的数值会被分割成chunks,并且最多toast_max_chunk_size个byte(缺省是2KB);
- 当存储的长度超过toast_tuple_threshold(通常是2KB),就会触发toast存储;
- toast将会压缩或者移动字段值直到超过部分比toast_tuple_targer值小(这个值通常也是2KB)
建表时自动创建toast表
dellstore2=# create table toast_1(id int);
CREATE TABLE
dellstore2=# select oid,relname,reltoastrelid from pg_class where relname = 'toast_1';
oid | relname | reltoastrelid
-------+---------+---------------
16498 | toast_1 | 0
(1 row)
dellstore2=# create table toast_2(id int,info text);--其中info字段是text类型,则会自动产生toast表来存储。
CREATE TABLE
dellstore2=# select oid,relname,reltoastrelid from pg_class where relname = 'toast_2';
oid | relname | reltoastrelid
-------+---------+---------------
16501 | toast_2 | 16504
(1 row)
dellstore2=# select oid,relname from pg_class where oid = 16504;
oid | relname
-------+----------------
16504 | pg_toast_16501
(1 row)
更改表的存储方式为toast
语法:
ALTER TABLE [ TABLE ] ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
dellstore2=# create table toast_0(info text);
CREATE TABLE
dellstore2=# \d+ toast_0
Table "public.toast_0"
Column | Type | Modifiers | Storage | Stats target | Description
--------+------+-----------+----------+--------------+-------------
info | text | | extended | |
dellstore2=# alter table toast_0 alter column info set storage main;
ALTER TABLE
dellstore2=# \d+ toast_0
Table "public.toast_0"
Column | Type | Modifiers | Storage | Stats target | Description
--------+------+-----------+---------+--------------+-------------
info | text | | main | |
查看toast表的名字
dellstore2=# select relname,relfilenode,reltoastrelid from pg_class where relname = 'toast_0';
relname | relfilenode | reltoastrelid
---------+-------------+---------------
toast_0 | 16507 | 16510
(1 row)
dellstore2=# select relname from pg_class where oid = 16510;
relname
----------------
pg_toast_16507
(1 row)
toast四种存储策略
策略 | 说明 |
---|---|
PLAIN | 避免压缩和行外存储。只有那些不需要TOAST策略就能存放的数据类型允许选择(例如 int类型),而对于text这类要求存储长度超过页大小的类型,是不允许采用此策略的 |
MAIN | 允许压缩,但不许行外存储。实际上,为了保证大数据的存储,行外存储在其他方式(例如压缩)都无法满足的情况下,作为最后手段还是会被启动。因此理解为尽量不使用行外存储更贴切 |
EXTENDED | 允许行外存储和压缩。一般会压缩,如果还是太大,就会行外存储 |
EXTERNA | 允许行外存储,但不允许压缩。类似字符串这种会对数据的一部分进行操作的字段,采用此策略可能获得更高的性能,因为不需要读取整行数据再解压 |
toast表额外的三个字段
字段名 | 属性 |
---|---|
chunk_id | 标识TOAST表的OID字段 |
chunk_seq | chunk的序列号,与chunk_id的组合唯一索引可以加速访问 |
chunk_data | 存储TOAST表的实际数据 |
dellstore2=# select oid,relname,reltoastrelid from pg_class where relname = 'toast_0';
oid | relname | reltoastrelid
-------+---------+---------------
16507 | toast_0 | 16510
(1 row)
dellstore2=# \d+ toast_0
Table "public.toast_0"
Column | Type | Modifiers | Storage | Stats target | Description
--------+------+-----------+---------+--------------+-------------
info | text | | main | |
toast表的计算
- 计算一个表的大小时要注意统计toast的大小,因为对超长字段存储时,在基础表上可能只存了20%,另外的数据都存到了toast表里面去了,计算大小时要结合起来看
- 索引也是一样,对于表里有extended或者EXTERNA类型的会创建toast表,两者的关联是通过pg_class里的OID取关联的
dellstore2=# create table toast_t(id int,name varchar(50),info text);
CREATE TABLE
dellstore2=# select relname,relfilenode,reltoastrelid from pg_class where relname = 'toast_t';
relname | relfilenode | reltoastrelid
---------+-------------+---------------
toast_t | 16513 | 16516
(1 row)
dellstore2=# insert into toast_t select generate_series(1,2),'test',repeat('t',10000);
INSERT 0 2
dellstore2=# select pg_column_size(id),pg_column_size(name),pg_column_size(info) from toast_t;
pg_column_size | pg_column_size | pg_column_size
----------------+----------------+----------------
4 | 5 | 125
4 | 5 | 125
(2 rows)
dellstore2=# select pg_size_pretty(pg_relation_size('toast_t')),pg_size_pretty(pg_relation_size(16516));
pg_size_pretty | pg_size_pretty
----------------+----------------
8192 bytes | 0 bytes
(1 row)
dellstore2=# insert into toast_t select generate_series(1,2),'test',repeat('t',100000);
INSERT 0 2
dellstore2=# select pg_size_pretty(pg_relation_size('toast_t')),pg_size_pretty(pg_relation_size(16516));
pg_size_pretty | pg_size_pretty
----------------+----------------
8192 bytes | 0 bytes
(1 row)
dellstore2=# insert into toast_t select generate_series(1,2),'test',repeat('t',200000);
INSERT 0 2
dellstore2=# select pg_size_pretty(pg_relation_size('toast_t')),pg_size_pretty(pg_relation_size(16516));
pg_size_pretty | pg_size_pretty
----------------+----------------
8192 bytes | 8192 bytes
(1 row)
dellstore2=# insert into toast_t select generate_series(1,2),'test',repeat('t',400000);
INSERT 0 2
dellstore2=# select pg_size_pretty(pg_relation_size('toast_t')),pg_size_pretty(pg_relation_size(16516));
pg_size_pretty | pg_size_pretty
----------------+----------------
8192 bytes | 16 kB
(1 row)
可以看到后插入的数据随着字段内容的增多,toast段一直在变大。基础表的大小没有变化。
toast表的优点
- 可以存储超长大字段,避免之前不能直接存储的限制;
- 物理上与普通表是分离的,检索查询时不检索到该字段会极大地加快速度;
- 更新普通表时,该表地toast数据没有被更新时,不用去更新toast表
toast表的缺点
- 对大字段的索引创建是一个问题,有可能会失败,通常不建议在大字段上创建,全文检索是一个解决方案
- 大字段的更新会有点慢, 其他DB也存在相同问题
toast简介的更多相关文章
- Android Toast简介
Toast是Android中一种提供给用户简短信息的视图,该视图已浮于应用程序之上的形式呈现给用户.因为它并不获得焦点,即使用户正在输入什么也不会受到影响.它的目标是尽可能以不显眼的方式,使用户看到你 ...
- Android带图片的Toast(自定义Toast)
使用Android默认的Toast Toast简介: Toast是一个简单的消息显示框,能够短暂的出现在屏幕的某个位置,显示提示消息. 默认的位置是屏幕的下方正中,一般Toast的使用如下: Toas ...
- 【UWP开发】一个简单的Toast实现
Toast简介 在安卓里Toast是内置原生支持,它是Android中用来显示显示信息的一种机制.它主要用于向用户显示提示消息,没有焦点,显示的时间有限,过一定的时间就会自动消失.在UWP中虽然没有原 ...
- [UWP 开发] 一个简单的Toast实现
Toast简介 在安卓里Toast是内置原生支持,它是Android中用来显示显示信息的一种机制.它主要用于向用户显示提示消息,没有焦点,显示的时间有限,过一定的时间就会自动消失.在UWP中虽然没有原 ...
- appium应用切换以及toast弹出框处理
一.应用切换 应用切换的方法很简单,直接调用driver.start_activity()方法,传入app_package和app_activity参数,示例代码如下: from appium imp ...
- Appium之Toast元素识别
问题思考 在日常使用App过程中,经常会看到App界面有一些弹窗提示(如下图所示)这些提示元素出现后等待3秒左右就会自动消失,那么我们该如何获取这些元素文字内容呢? Toast简介 Android中的 ...
- python+Appium自动化:toast定位
Toast简介 Toast是一种简易的消息提示框. 当视图显示给用户,在应用程序中显示为浮动.和Dialog不一样的是,它永远不会获得焦点,无法被点击. 用户将可能是在中间键入别的东西.Toast类的 ...
- OS快速开发必备
github:https://github.com/koknine (终于改成以前的了) 当前移动互联网行业太火爆,移动端的需求日益增长,很多开发人员每天都应对着各种需求,作为一名iOS开发人员,对于 ...
- Tost元素识别
在日常使用App过程中,经常会看到App界面有一些弹窗提示(如下图所示)这些提示元素出现后等待3秒左右就会自动消失,那么我们该如何获取这些元素文字内容呢? Toast简介 Android中的Toast ...
- Appium+python自动化(二十六)- 烟花一瞬,昙花一现 -Toats提示(超详解)
简介 今天宏哥在这里首先给小伙伴们和童鞋们分享一个有关昙花的小典故:话说昙花原是一位花神,她每天都开花,四季都灿烂.她还爱上了每天给她浇水除草的年轻人.后来,此事给玉帝得知.于是,玉帝大发雷霆,要拆散 ...
随机推荐
- 如何又快又好实现 Catalog 系统搜索能力?火山引擎 DataLeap 这样做
摘要 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维.治理.资产.安全等全套数据中台建设,降低工作成本和数据维护成本.挖掘数据价 ...
- PHP判断访问来源是PC端还是移动端
一个方法轻松搞定,各种判断后当返回true为移动端,反之为PC端. function isMobile(){ // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset ($ ...
- vue学习笔记(八)---- vue中的实例属性(wacth和computed的使用)
一.watch属性的使用 1.传统方式实现双向数据改变监听事件(姓名拼接案例) <div id="app"> 姓: <input type="text& ...
- 你好 ChatGPT, 帮我看下这段代码有什么问题?
点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多系列文章. 今天一个很简单的功能,触发了一个 BUG,处 ...
- EL&JSTL笔记 javaweb+jdbcTempl
# 今日内容 1. JSP: 1. 指令 2. 注释 3. 内置对象 2. MVC开发模式 3. EL表达式 4. JSTL标签 ...
- Java 调用 PaddleDetection 模型
文章地址 介绍 训练好的模型要给业务调用,deepjavalibrary/djl:Java 中与引擎无关的深度学习框架 (github.com) 可以完成这件事,它支持使用 Java 调用 PyTor ...
- C语言排序 冒泡 选择 快排
冒泡排序 冒泡排序是一种简单的排序算法,其基本思想是重复地交换相邻两个元素,将较大的元素向右"冒泡",较小的元素向左"沉淀",从而将序列中的最大元素逐渐移到最后 ...
- makefile 入门第一课
makefile入门第一课 百度百科makefile词条: 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中. makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些 ...
- pytest基本使用指南
注:关于pytest的基础要点个人已经总结好了, 一. 启动: 在主函数main下启动:pytest.main(['-q','test_demo.py']) 在命令行启动:pytest ./test_ ...
- adb简记
ADB Android Debug Bridge(安卓调试桥) tools.它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互.在某些特殊的情况下进入不了系统,adb就派上用场啦! 前提条件 ...