广告
返回顶部
首页 > 资讯 > 数据库 >Postgresql TOAST
  • 381
分享到

Postgresql TOAST

PostgresqlTOAST 2018-06-17 06:06:40 381人浏览 绘本
摘要

postgresql TOAST TOAST (The Oversized-Attribute Storage Technique) 超尺寸字段存储技术。就是说超长字段在Postgres的一个存储方式。 WHY? Postgresql pa

Postgresql TOAST

postgresql TOAST

TOAST (The Oversized-Attribute Storage Technique) 超尺寸字段存储技术。就是说超长字段在Postgres的一个存储方式。

WHY?

Postgresql page大小是固定的(通常为8KB),且不允许tuples跨多个page存储。因此不能存储非常大的字段值。为了克服这个限制,大字段值需要压缩甚至分割成多个物理行进行存储,这就是TOAST技术。TOAST对用户来说是透明的。

存储方式

Out-of-line, on-disk TOAST storage 行外磁盘存储

  • 当表中字段任何一个有Toast,那这个表都会有这一个相关联的Toast表,OID被存储在pg_class.reltoastrelid里面。Out-of-line values(可能是压缩后的,如果使用了压缩)将会被分割成chunks,每个chunk大小为toast_max_chunk_size(缺省是2Kb),每个chunk作为单独的一行存储在TOAST表中。
  • 相比较普通表(MaiN TABLE),TOAST有额外的三个字段(chunk_id,chunk_seq,chunk_data),有唯一索引在chunk_id和hunk_seq上提供快速查询。
chunk_id :标识TOASTed值的OID字段
chunk_seq :chunk的序列号,与chunk_id的组合唯一索引可以加速访问
chunk_data :存储TOAST的实际数据
  • 当存储的行数据超过toast_tuple_threshold值(通常是2kB),就会触发toast存储,这时toast将会压缩或者移动超出的字段值直到行数据比toast_tuple_targer值小(这个值通常也是2KB)。所以基础表上可能只存了20%的数据

Toast有识别4种不同可存储toast的策略:

# plain避免压缩或行外存储
PLAIN prevents either compression or out-of-line storage; furthermore it disables use of single-byte headers for varlena types. This is the only possible strategy for columns of non-TOAST-able data types
# extended允许压缩和行外存储(默认toast存储)
EXTENDED allows both compression and out-of-line storage. This is the default for most TOASTable data types. Compression will be attempted first, then out-of-line storage if the row is still too big
# external允许行外但不允许压缩
EXTERNAL allows out-of-line storage but not compression. Use of EXTERNAL will make substring operations on wide text and bytea columns faster(at the penalty of increased storage space) because these operations are optimized to fetch only the required parts of the out-of-line value when it is not compressed
# main允许压缩但不允许行外存储
MAIN allows compression but not out-of-line storage. (Actually, out-of-line storage will still be perfORMed for such columns, but only as a last resort when there is no other way to make the row small enough to fit on a page

上述压缩采用的是LZ compression技术。 可以通过 ALTER TABLE ... SET STORAGE更改字段的存储策略

查看TOAST存储

查看TOAST存储

CREATE TABLE test_toast(
    id int,
    name text,
    age int,
    create_time timestamp without time zone);

INSERT INTO test_toast SELECT generate_series(1,10000),md5(random()::text),
((random()*100)::integer),clock_timestamp();

d+ test_toast;
Table "test.test_toast"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
-------------+-----------------------------+-----------+----------+---------+----------+--------------+-------------
id | integer | | | | plain | |
name | text | | | | extended | |
age | integer | | | | plain | |
create_time | timestamp without time zone | | | | plain | |

 select relname,relfilenode,reltoastrelid from pg_class where relname="test_toast";
relname | relfilenode | reltoastrelid
------------+-------------+---------------
test_toast | 102417 | 102420
(1 row)
注意:TOAST表名,可通过以下方式查看
 ! oid2name -d postgres -f 102420
From database "postgres":
Filenode Table Name
---------------------------
102420 pg_toast_102417

含有TOAST表的空间大小计算!

如果表中有某些字段使用TOAST进行存储,那么,通过普通的pg_relation_size("表名")查询不到TOAST字段所占用的空间。如果要查询TOAST字段所占用的空间,可以先查询出TOAST字段对应的OID,再通过pg_relation_size(OID)的方式查询出TOAST字段所占用的空间。


select pg_size_pretty(pg_relation_size("test_toast","main"));
select pg_size_pretty(pg_relation_size(102420));

增加字段大小,产生TOAST存储
update test_toast set name=name||name where id=1;

postgres=> select pg_size_pretty(pg_relation_size(102417));
pg_size_pretty
----------------
832 kB
(1 row)
postgres=> select pg_size_pretty(pg_relation_size(102420));
pg_size_pretty
----------------
3072 kB
(1 row)
postgres=> select pg_size_pretty(pg_table_size("test_toast"));
pg_size_pretty
----------------
4016 kB
(1 row)
使用pg_table_size查出的结果是包括TOAST字段所占用的空间的。
注意:物理文件空间大小查询参考《Cluster database and table》

TOAST的优缺点

Toast的优点

  • 可以存储超长超大字段,避免之前不能直接存储的限制
  • 物理上与普通表是分离的,检索查询时不检索到该字段会极大地加快速度
  • 更新普通表时,该表的Toast数据没有被更新时,不用去更新Toast表

Toast的劣势:

  • 对大字段的索引创建是一个问题,有可能会失败,其实通常也不建议在大字段上创建,全文检索倒是一个解决方案。
  • 大字段的更新会有点慢,其它DB也存在,通病
您可能感兴趣的文档:

--结束END--

本文标题: Postgresql TOAST

本文链接: https://www.lsjlt.com/news/5746.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Postgresql TOAST
    Postgresql TOAST TOAST (The Oversized-Attribute Storage Technique) 超尺寸字段存储技术。就是说超长字段在Postgres的一个存储方式。 WHY? PostgreSQL pa...
    99+
    2018-06-17
    Postgresql TOAST
  • PostgreSQL公开课(第19期)-Toast技术特点与应用
    PostgreSQL公开课(第19期)-Toast技术特点与应用 Toast简介 Toast的存储方式 Toast4种压缩策略 Toast表的计算方式 Toast表的优点与缺点 与Oracle大对象存储方式对比 由于PG数据库...
    99+
    2018-04-19
    PostgreSQL公开课(第19期)-Toast技术特点与应用
  • Android自定义Toast
    Java代码:  public void showCustomToast(View v){ // Toast.makeText(this, "吐司", 0).show...
    99+
    2022-06-06
    toast Android
  • ReactNative如何实现Toast
    这篇文章将为大家详细讲解有关ReactNative如何实现Toast,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。定义组件import React, ...
    99+
    2022-10-19
  • android Toast怎么使用
    在Android中,Toast是一种简单的用于显示短暂消息的UI组件。要使用Toast,可以按照以下步骤进行操作:1. 在Activ...
    99+
    2023-08-24
    android Toast
  • android Toast大全(五种情形)建立属于你自己的Toast
    在Android开发中,Toast是一种简单的弹出提示,用于向用户显示临时的消息。下面是五种情形的Toast使用示例:1. 普通To...
    99+
    2023-09-23
    Android
  • Android学习笔记之Toast
    使用统一标准化的Toast Toast.makeText(Context context, CharSequence text, int dur...
    99+
    2022-06-06
    android学习 toast Android
  • Android中Toast怎么使用
    这篇文章给大家分享的是有关Android中Toast怎么使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。老规矩,先上效果图吧主要实现了几种常用的方式:1.最基本的Toast系统自带Toast采用的是队列的方式,...
    99+
    2023-06-14
  • Android的Toast问题有哪些
    这篇文章主要讲解了“Android的Toast问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android的Toast问题有哪些”吧!1. 异常和偶尔不显示的问题当你在程序中调用了...
    99+
    2023-06-04
  • Vue中Toast的示例分析
    这篇文章将为大家详细讲解有关Vue中Toast的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、效果图二、说明这类提示框组件我们通常都会直接在 JS 代码中进行...
    99+
    2022-10-19
  • android toast的用法有哪些
    Android中Toast的用法有以下几种:1.显示短时间的提示信息:使用`Toast.makeText(context, text...
    99+
    2023-08-15
    android toast
  • Android 之 Toast 的基本使用
    本节引言: 好的,终于学习完Adapter类相关的一些控件,当然除了讲解的那几个,还有其他很多的 相关的控件,就不慢慢讲解了~有需要的自行查阅文档,查看相关的用法,本节带来的是: Android用于提示信息的一个控件——Toast(吐司...
    99+
    2023-09-16
    android java 开发语言
  • Android中Toast的用法是什么
    Toast是Android中一种用来显示简短信息的组件,它以一种弹出式的方式显示在屏幕上方或下方。Toast通常用于提供一些反馈或提...
    99+
    2023-09-14
    Android
  • Android的Toast问题怎么解决
    这篇“Android的Toast问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android的Toast问题怎么...
    99+
    2023-06-04
  • Android 自定义 Toast 显示时间
    Android 自定义 Toast 显示时间实现代码:package com.wm.realname.util;import android.content.Context;import android.os.Handler;import ...
    99+
    2023-05-31
    android toast 时间
  • vue怎么实现Toast轻提示
    这篇文章主要介绍“vue怎么实现Toast轻提示”,在日常操作中,相信很多人在vue怎么实现Toast轻提示问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue怎么实现Toast轻提示”的疑惑有所帮助!接下来...
    99+
    2023-06-29
  • Android怎么自定义Toast样式
    要自定义Toast样式,可以按照以下步骤进行操作:1. 创建一个自定义的Toast布局文件。在res目录下的layout文件夹中创建...
    99+
    2023-08-12
    Android
  • android中toast的用法有哪些
    在Android中,Toast用于显示短暂的消息提示。下面是一些Toast的用法:1. 显示默认Toast:使用makeText方法...
    99+
    2023-08-12
    android toast
  • Android 开发之Dialog,Toast,Snackbar提醒
    今天给大家带来一篇简单易懂的微技巧文章,并没有什么高深的技术点,但重点是在细节,相信可以给不少朋友带来帮助。 Dialog和Toast所有人肯定都不会陌生的,这个我们平时用的实...
    99+
    2022-06-06
    snackbar dialog toast Android
  • vue如何实现Toast轻提示
    目录vue实现Toast轻提示首先创建一个toast组件在js文件中引入组件在入口文件中引入上面这个js文件下面就可以在view里全局使用了使用vant的Toast轻提示报错文档中是...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作