PostgreSQL 烤面包的味道好极了 TOAST

2023-12-18 21:40

本文主要是介绍PostgreSQL 烤面包的味道好极了 TOAST,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在传统的数据库中,DBA最恨  听到的词就是,我要使用 BLOB 字段,或者类似的类型来处理,huge的数据,他可能是一段图形的在转换后的“乱码”,也可能是某个蹩脚 程序设计出来的 “怪胎”。如果是强有力的 DBER 可能直接驳回此类需求,但换来的是,“这不有这个字段嘛”, 为啥不让用,就你事多的,我就存几行诸如此类的,“欢迎词”。

PostgreSQL的管理员们是否会得到这样的欢迎词,就与他对Postgresql 的TOAST 的了解以有关。PG的默认的数据也大小是多少,8K,与SQL SERVER类似。MYSQL 是16KB的PAGE页(默认)

那TOAST 首先的含义以及出现的需求就有了,因为默认的数据库的页面,无法处理大容量的数据,所以针对大容量的数据就产生了一些字段的类型,来满足某些“变态” 的需求。TOAST的含义其实就是通过对大字段的分解,将其分配到多个物理行上的方式。所以一个大面包,把他切片,然后就是叫“吐司”,TOAST的名词来源可能是这样来的。

当然如果仅仅想到就是将多个物理行进行组织后来存储大型数据,未免想的还是少了一点,任何数据库的数据要进行处理,都需要走内存的这一关,而如何将大字段与内存进行一个友好的“匹配”, 那就还得在费点功夫。

这里如果对PG 陌生的话,先纠正一个概念,TOAST不是一个字段类型,他是一种底层数据存储的方式,在其上方才是那些需要扩展的字段类型,所以大型字段的存储都要经过TOAST一关。

还是先感官再理论,否则按照什么理论来发散,脑子大约会开始陷入停转可能。

CREATE TABLE messages (message text);

INSERT INTO messages

SELECT (SELECT

        string_agg(chr(floor(random() * 26)::int + 65), '')

        FROM generate_series(1,10000))

FROM generate_series(1,10);

在你的PG上(我这里的版本是11),运行了上面的语句,插入一堆数据后

我就得到了关于下面的这个图,一个存储数据的toast表的实际内容是什么样的

下面总结一下TOAST

1 PG的大容量数据和实体表不是存在一起的

2 PG会分配一个表来单独存储分出来的数据

3 这个表里面会存储大容量的数据。

4 在这个专门存储toast的数据类型也是有选择的,json , text,varchar, bytea等类型都会将数据存储在这个实体表对应的toast表中。

5 TOAST 的在存储数据的时候有四种模式  plain (不使用toast) extended (默认压缩,既要压缩,也要行外存储)external (不压缩,直接使用行外存储)  Main模式(压缩,但行外存储会排在最后的选择范围)

那这里就会对上面的产生一个问题,就是我们在处理这样的数据的时候,这四种可以选择的类型,那种是最优选,或者有什么推荐,或者还是使用默认的模式。

参看上面的文字,其中对于上面四种模式中给出了建议,使用Main 模式

怎么修改优化,参见下面的语句

ALTERTABLE YourTable
ALTERCOLUMN YourColumn SET STORAGE (PLAIN | EXTENDED | EXTERNAL |MAIN)
所以总结一下,PG 在处理比较大的字段上并没有什么问题,但涉及不合理的事情其实与能不能接受,
倒是无关,主要是数据库种类这么多,为何非要在一个数据库上“拼死拼活”, 不如找一个更合适字段处理特
别大的数据的数据库,他不香吗?

这篇关于PostgreSQL 烤面包的味道好极了 TOAST的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/509846

相关文章

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Ubuntu 22.04 服务器安装部署(nginx+postgresql)

《Ubuntu22.04服务器安装部署(nginx+postgresql)》Ubuntu22.04LTS是迄今为止最好的Ubuntu版本之一,很多linux的应用服务器都是选择的这个版本... 目录是什么让 Ubuntu 22.04 LTS 变得安全?更新了安全包linux 内核改进一、部署环境二、安装系统

对postgresql日期和时间的比较

《对postgresql日期和时间的比较》文章介绍了在数据库中处理日期和时间类型时的一些注意事项,包括如何将字符串转换为日期或时间类型,以及在比较时自动转换的情况,作者建议在使用数据库时,根据具体情况... 目录PostgreSQL日期和时间比较DB里保存到时分秒,需要和年月日比较db里存储date或者ti

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

PostgreSQL如何用psql运行SQL文件

《PostgreSQL如何用psql运行SQL文件》文章介绍了两种运行预写好的SQL文件的方式:首先连接数据库后执行,或者直接通过psql命令执行,需要注意的是,文件路径在Linux系统中应使用斜杠/... 目录PostgreSQ编程L用psql运行SQL文件方式一方式二总结PostgreSQL用psql运