postgresql为“大字段“的物理存储提供了TOAST功能,通过合适的配置策略能够减少IO次数和扫描块数,进而提升查询速度。
TOAST:The Oversized-Attribute Storage Technique

特点:
PostgreSQL采用固定页面大小(通常是8Kb,不象oracle在运行期间有多种选择),元组不能跨越多个页面,无法实现“大字段值“的直接存储。TOAST提供了解决方法,允许大的字段值被压缩或分裂为多个物理行。
postgresql只为部分数据类型支提供TOAST支持,为支持TOAST,数据类型必须是变长(varlena)的类型。前32位存储着以字节记的数值总长度(包括长度本身)。
TOAST采用最高的两个二进制位用于标识压缩与行外存储,因此“大字段“的逻辑长度被限制在了1GB2^(32-2)-1)。
两个位都是零,表示数值未经过TOAST方式的数值;
第32位为1,表示该数值被压缩,使用前必须先解压缩;
第31位为1,表示该数值采用行外存储,此时只是存储着一个指针,该指针指向其他的地方。另外30个位表示数据的实际尺寸,而不是解压缩或者从线外数据抓过来之后的逻辑尺寸。
行外数据被分裂成(如果压缩过,以压缩后为参考)最多TOAST_MAX_CHUNK_SIZE(这个数值略小于BLCKSZ/4,或者缺省 2K字节)字节的块,每个块都作为独立的行在TOAST表里为所属表存储。每个TOAST表都有字段chunk_id,chunk_seq和chunk_data。在chunk_id和chunk_seq上有一个唯一索引,提供对数值的快速检索。
只有表中存储超过BLCKSZ/4字节(通常是2Kb)的行才会触发,对字段进行压缩和行外存储,直到小于BLCKSZ/4字节,或者无法得到更好的结果的时候才停止。UPDATE操作过程中,未改变的字段的数值通常原样保存;因此UPDATE行外存储的记录时,如果行外数据值没有变化,将不会带来TOAST开销存在。
TOAST代码识别四种不同的存储可TOAST字段的策略:

  • PLAIN避免压缩或者行外存储。只对那些非TOAST数据类型才有效。
  • EXTENDED允许压缩和行外存储。大多数TOAST数据类型的缺省值。首先进行压缩,如果行仍然太大,则进行行外存储。
  • EXTERNAL允许行外存储,不许压缩。使用 EXTERNAL将令那些在 text 和 bytea 字段上的子字串操作更快(代价是增加了存储空间),因此这些操作是经过优化的:如果行外数据没有压缩,那么它们只抓取需要的部分。
  • MAIN允许压缩,不允许行外存储。当数据值压缩过后仍然太大将会采用行外存储。每个可以 TOAST 的数据类型都为该数据类型的字段声明一个缺省策略,但是特定表的字段的存储策略可以用ALTER TABLE SET STORAGE修改。

优点:
相对直接的存储方式来说,数据经过TOAST方式后,单个或者连续数据块中能够存储更多的数据值,对于访问非“大字段”时,能够大量减少扫描块数或者物理IO次数;
对于极少访问的含“大字段”记录,经过手动修改存储属性,采用TOAST方式,即便值小于2K的情况下同样能够带来很好的效果。

针对系统数据访问特定,灵活的采用TOAST存储策略总能够为系统带来性能的提升。

 

题外话:oracle的大字段的存储采用了行外的方式,对大字段默认进行段存储,同时系统默认创建索引。将大字段根据磁盘配置进行单独存储,也是提升oracle部署性能的常见方式。

转载于:https://www.cnblogs.com/daduxiong/archive/2010/08/23/1806706.html

postgresql TOAST存储方式相关推荐

  1. POSTGRESQL TOAST 数据扩展存储技术原理与优势

    POSTGRESQL 的TOAST 功能是POSTGRESQL 本身提供对于可变长大字段的管理的方式. 讲此方面的的文章也是比较多的. 这里想提及的是,从TOAST 功能中对数据库系统设计的一种新的认 ...

  2. PostgreSQL 修改文本类型字段的存储方式

    参考资料 PostgreSQL存储方式分为以下4种: PLAIN避免压缩或者线外存储:而且它禁用变长类型的单字节头部.这是不可TOAST数据类型列的唯一可能的策略.只是对那些不能TOAST的数据类型才 ...

  3. Android中的数据存储方式

    Android数据存储的5中方式总结: A:使用SharedPreferences存储方式 B:文件存储数据 C:SQLite数据库存储数据 D:使用ContentProvider存储数据 E:网络存 ...

  4. android 存储方式简书,Android的多种数据存储方式

    1. 简介 作为一个完整的应用程序,数据存储操作是必不可少的.现在Android的离线缓存就是通过网络良好状态时将从服务器收到的数据保存到本地.Android系统中主要提供了3种方式进行数据存储,分别 ...

  5. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File 之 —— SharedPreferences...

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值 对数据,通常用来存储一些简单的配置信息.其存储位置在/dat ...

  6. 深入剖析Android中最简单的数据存储方式:SharedPreferences

    目录 一. 使用SharedPreferences存储数据 二. 数据的存储位置和格式 三.存储数据的获取 四. 存取复杂类型的数据 五. 设置数据文件的访问权限 Hello,你好呀,我是灰小猿,一个 ...

  7. mysql中存储gis数据类型_GIS数据格式及存储方式的基本概念

    GIS概念中有相当多的数据文件格式,我们经常接触到的数据格式可以大致分为"栅格数据"与"矢量数据"这两类.这两类数据分别对应着不同的应用场景,我们通常使用&qu ...

  8. Android的5中主要的数据存储方式

    Android有5中主要的数据存储方式: 1.Android本身的数据库(SQLite数据库):SQlite是一个轻量级的.跨平台的数据库.占用内存小,支持基本的SQL语法,通常用于存储用户信息. 2 ...

  9. CSR稀疏矩阵存储方式

    矩阵可分为稠密矩阵和稀疏矩阵,对于稀疏矩阵而言,使用同样的内存来存储这个矩阵显然是对内存的浪费,那么我们就可以想办法将矩阵中所有的o元素挥着不相关元素剔除,怎么剔除,第一种方法是通过三个一维矩阵来存储 ...

最新文章

  1. 沈向洋、华刚:读科研论文的三个层次、四个阶段与十个问题
  2. asp.net core选项配置的研究
  3. redis key存在则删除_Redis加锁的几种实现
  4. P7097-[yLOI2020]牵丝戏【dp】
  5. LeetCode 982. 按位与为零的三元组(位运算+计数)
  6. Tomcat运行三种模式:http-bio|http-nio|http-apr介绍
  7. 如何让隐藏在大数据背后的价值发挥出来?
  8. Rust: 为什么同样的情况,有时不需要解引用?
  9. plsql 通过 excel 创建表
  10. 【贪玩巴斯】无线传感器网络(三)「Mac协议讲解」——2021-10-08
  11. mysql etc my.cnf_Mysql数据库服务器配置文件/etc/my.cnf的详细配置
  12. 远程调试监视器 已在计算机上关闭,错误:“Microsoft Visual Studio 远程调试监视器”(MSVSMON.EXE) 似乎没有在远程计算机上运行。...
  13. GUEST帐号“反客为主”
  14. BP神经网络对鸢尾花进行分类
  15. c语言 x16 x15 x2 1,CRC算法原理及C语言实现
  16. Micropython——关于通信I2C协议的应用和原理讲解
  17. 代理模式(静态代理和动态代理)
  18. jsp调用python脚本_jsp里引用bean
  19. 生活中的定律——破窗效应
  20. Linux效劳器装机安全疾速进阶指南(2)

热门文章

  1. 保姆级教程 | TensorFlow-YOLOv3 从本地训练到服务器部署全过程
  2. 目标检测二十年间那些事儿——加速与优化
  3. 学术人必备!懒人制作学术会议Oral/Spotlight Video指南
  4. OpenCV多目标跟踪与视频分析
  5. 【资源下载】866页《计算机视觉:原理,算法,应用,学习》最新第五版-附下载
  6. C语言中连续两个printf,在C中两个连续的printf()调用的奇怪行为
  7. 如何使用OSQP-Eigen
  8. java 不取空值_Java:如何更优雅的处理空值?
  9. Dockerfile 常用命令
  10. ResNet原理和实现