【PostgreSQL的变长字段数据超过多少会写入到TOSAST表】

通常PostgreSQL里如果一个元祖的变长字段的数据量,超过2KB,则PostgreSQL会尝试进行压缩,把元组控制在2KB之内,如果不能满足2KB之内的需求,就需要独立的toast表来存储了。

一、toast表相关的列存储参数

这个是否尝试压缩是受列上的Storage这一参数决定的,如果想要用toast但是又不想压缩,可以把列的storage参数设置为external。

postgres=# \d+ test_toast Table "public.test_toast"Column |  Type   | Collation | Nullable | Default | Storage  | Compression | Stats target | Description 
--------+---------+-----------+----------+---------+----------+-------------+--------------+-------------id     | integer |           |          |         | plain    |             |              | name   | text    |           |          |         | extended |             |              | 
Access method: heap

这个列的存储策略有如下四个可供调整的值。

plain:该列仅存储在堆中且未压缩。
extended:如有必要,可以压缩该列并将其存储在 toast 中。
external:该列可以存储在 toast 中,但不能压缩。有时,可以使用此模式以更高的磁盘空间消耗为代价来提高性能(避免压缩/解压缩)。
main:该列仅存储在堆中,但与普通模式不同,允许压缩。

对于某类字段的默认存储类型,pg_type的typstorage中有明确的定义

postgres=# select typname,typstorage from pg_type where typname in ('int4','text','');typname | typstorage 
---------+------------int4    | ptext    | x
(2 rows)

可以用如下方式进行调整

postgres=# alter table test_toast alter column name set storage external;
ALTER TABLE
postgres=#  \d+ test_toast Table "public.test_toast"Column |  Type   | Collation | Nullable | Default | Storage  | Compression | Stats target | Description 
--------+---------+-----------+----------+---------+----------+-------------+--------------+-------------id     | integer |           |          |         | plain    |             |              | name   | text    |           |          |         | external |             |              | 
Access method: heap

二、2KB的大小如何是如何计算的

这个2KB的阈值其实受源码里的TOAST_TUPLE_THRESHOLD限制的,

/** These symbols control toaster activation.  If a tuple is larger than* TOAST_TUPLE_THRESHOLD, we will try to toast it down to no more than* TOAST_TUPLE_TARGET bytes through compressing compressible fields and* moving EXTENDED and EXTERNAL data out-of-line.** The numbers need not be the same, though they currently are.  It doesn't* make sense for TARGET to exceed THRESHOLD, but it could be useful to make* it be smaller.** Currently we choose both values to match the largest tuple size for which* TOAST_TUPLES_PER_PAGE tuples can fit on a heap page.** XXX while these can be modified without initdb, some thought needs to be* given to needs_toast_table() in toasting.c before unleashing random* changes.  Also see LOBLKSIZE in large_object.h, which can *not* be* changed without initdb.*/
#define TOAST_TUPLES_PER_PAGE	4#define TOAST_TUPLE_THRESHOLD	MaximumBytesPerTuple(TOAST_TUPLES_PER_PAGE)#define TOAST_TUPLE_TARGET		TOAST_TUPLE_THRESHOLD

根据代码定义可以看到:

TOAST_TUPLE_THRESHOLD = MaximumBytesPerTuple(TOAST_TUPLES_PER_PAGE)

而MaximumBytesPerTuple函数的定义如下:

/** Find the maximum size of a tuple if there are to be N tuples per page.*/
#define MaximumBytesPerTuple(tuplesPerPage) \MAXALIGN_DOWN((BLCKSZ - \MAXALIGN(SizeOfPageHeaderData + (tuplesPerPage) * sizeof(ItemIdData))) \/ (tuplesPerPage))

在C语言代码里,我们有时会遇到一行代码太长而影响阅读或者与要求的编码规范不符的情况,此时需要将这行代码分成多行来写。在编译时,\后面的换行符将被忽略,当做一行处理。

所以

MaximumBytesPerTuple(tuplesPerPage) = MAXALIGN_DOWN((BLCKSZ - MAXALIGN(SizeOfPageHeaderData + (tuplesPerPage) * sizeof(ItemIdData))) / (tuplesPerPage))TOAST_TUPLE_THRESHOLD 
= MaximumBytesPerTuple(TOAST_TUPLES_PER_PAGE)
= MAXALIGN_DOWN((BLCKSZ - MAXALIGN(SizeOfPageHeaderData + (TOAST_TUPLES_PER_PAGE) * sizeof(ItemIdData))) / (TOAST_TUPLES_PER_PAGE))

而定义里TOAST_TUPLES_PER_PAGE=4,并且默认BLCKSZ = 8KB

PageHeaderData --在 page 头部,24 个字节长度,记录 page 的元数据信息。所以SizeOfPageHeaderData= 24 bytes

ItemIdData --在 page header 之后,一个记录(偏移量,长度)对的数组,指向实际 tuple 项,每个 4 字节。所以sizeof(ItemIdData)=4 bytes

所以上述的TOAST_TUPLE_THRESHOLD可以转换为下边

TOAST_TUPLE_THRESHOLD
= MAXALIGN_DOWN((BLCKSZ - MAXALIGN(24bytes  + 4 * 4bytes)) / 4= MAXALIGN_DOWN((8KB - MAXALIGN(24bytes + 4 * 4bytes)) / 4~=2KB

因此如果变长字段的storage参数为external,表字段很长存储超过2KB的时候,就会触发行外存储,把数据存储到toast表里。如果是extended则会尝试进行压缩,把元祖控制在2KB之内,如果不能满足2KB之内的需求,就需要独立的toast表来存储。

三、如何调整元祖存储到toast表的这个阈值

如果对于2KB的设置觉得不符合需求的话,可以修改源码中的TOAST_TUPLE_THRESHOLD定义,再编译。不过这种静态编译比较麻烦。

而针对这一问题,PostgreSQL11版本增加了一个特性,支持表级动态设TOAST_TUPLE_THRESHOLD,这样就不需要调整源码实现了,也更加灵活了。

调整的语法如下,单位是bytes

postgres=# alter table test_toast  set (toast_tuple_target = 4096);  
ALTER TABLE
postgres=# \d+ test_toast Table "public.test_toast"Column |  Type   | Collation | Nullable | Default | Storage  | Compression | Stats target | Description 
--------+---------+-----------+----------+---------+----------+-------------+--------------+-------------id     | integer |           |          |         | plain    |             |              | name   | text    |           |          |         | external |             |              | 
Access method: heap
Options: toast_tuple_target=4096

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发缓存策略大揭秘:面试必备的缓存更新模式解析

在高并发场景中,缓存能抵挡大量数据库查询,减少数据库压力,对于缓存更新通常有以下几种模式可以选择: cache asideread/write throughwrite behind caching cache aside模式 Cache-aside模式是一种常用的用于管理缓存的模式。它…

RocketMQ学习笔记四(黑马)

课程地址: 1.Rocket第二章内容介绍_哔哩哔哩_bilibili (视频35~88,搭建了一个电商项目) 待学,待完善。

瑞_23种设计模式_策略模式

文章目录 1 策略模式(Strategy Pattern)★1.1 介绍1.2 概述1.3 策略模式的结构1.4 策略模式的优缺点1.5 策略模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析(Comparator) &#x1f64a…

mysql中用逗号隔开的某字段,如何判断其他表的字段值是否在这个字段中

因为要增加需求,需要将线上表中老数据,修改为新数据的规则。 线上两张表,sequence_number中is_use有3作废、2到期状态,需要根据这个状态和school_ai_authorization中的is_deleted修改新增的state字段。 sequence_number表结构&…

温暖如初春:新生儿脸红小贴士

引言: 新生儿脸红是许多父母热切期待的瞬间之一。这种可爱的现象不仅令人陶醉,还可能是宝宝良好健康的标志。然而,在欣喜之余,父母也需要留意脸红背后的可能原因和注意事项,以确保宝宝的舒适和健康。 1. 探寻原因&…

通天星CMSV6 车载视频监控平台 信息泄露漏洞

漏洞描述 通天星CMSV6车载视频监控平台 StandardLoginAction getAlser.acion接口处存在信息泄露漏洞 fofa语句 body"/808gps/" 漏洞复现 打开页面 构造payload POST /808gps/StandardLoginAction_getAllUser.action HTTP/1.1 Host: User-Agent: Mozilla/5.0 (…

ASP.NET区域检验云LIS平台源码 标本全生命周期管理

目录 一、云LIS系统功能亮点 二、收费项目管理 三、检验项目管理 系统功能 云LIS系统源码是一款全面的实验室信息管理系统源码,其主要功能包括样本管理、检测项目管理、质控管理、报告管理、数据分析、两癌筛查等多个方面。具有独立的配套SaaS模式运维管理系统&…

轻量级内网穿透服务-nps

1. NPS概述: NPS(内网穿透代理服务器)是一款由TalentYoung开发的轻量级、高性能的内网穿透代理服务器。它的设计目标是简单易用、功能强大,可以帮助用户在公网上访问内网服务。 NPS支持TCP、UDP、HTTP等多种协议,并提…

翻转时钟效果

时分秒三个部分结构功能完全一致&#xff0c;均有四块构成&#xff0c;上下各两块。 正面可见&#xff0c;背面不可见&#xff0c;同时需要调整翻转过程中的z-index。 初始状态card2为已经翻转状态。 calendar.html <!DOCTYPE html> <html lang"en">&…

非常有用的Python 20个单行代码

有用的 Python 单行代码片段&#xff0c;只需一行代码即可解决特定编码问题&#xff01; 在本文中&#xff0c;云朵君将分享20 个 Python 一行代码&#xff0c;你可以在 30 秒或更短的时间内轻松学习它们。这种单行代码将节省你的时间&#xff0c;并使你的代码看起来更干净且易…

H5 带网站测速引导页源码

源码名称&#xff1a;带网站测速引导页源码 源码介绍&#xff1a;一款带网站测速功能的引导页源码 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/10717.html

H5 机器人插件官网源码

源码名称&#xff1a;机器人插件官网源码 源码介绍&#xff1a;一款H5自适应机器人插件官网源码&#xff0c;可自行修改用于各种机器人插件官网。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/10774.html

基于单片机的直流电机调速系统设计

摘 要 在电子机械行业快速发展的今天&#xff0c;各类电子机械类产品以飞快的步伐进入到人们的视野中。为人们的生活带来极大的便利。同时也以各种不同的方式解放着生产力。在这些电子机械领域&#xff0c;电机无疑占着举足轻重的位置。现在各类工厂里的自动化生产线&#xff…

大数据与云计算

目录 一、大数据时代二、云计算——大数据的计算三、云计算发展现状四、云计算实现机制五、云计算压倒性的成本优势 一、大数据时代 我们先来看看百度关于 “大数据”&#xff08;Big Data&#xff09;的搜索指数。 可以看出&#xff0c;“大数据” 这个词是从2012年才引起关注…

MATLAB 四点确定唯一球面参数(44)

MATLAB 四点确定唯一球面参数(44) 一、算法简介二、算法实现1.代码2.结果一、算法简介 根据给定的四个点,快速拟合获取球的中心和半径,具体代码如下: 二、算法实现 1.代码 代码如下(示例): point1 = [0.0, 0.0, 0.0]

一种轻卡前视单目摄像头下线标定方法

本 文 介 绍 轻 卡 摄 像 头 的 下 线 标 定 要 求 和 方 法 &#xff0c; 包 括 工 站 搭 建 要 求 、 前 视 摄 像 头 的 安 装 要求 &#xff0c; 详 细 阐 述 摄 像 头 的 下 线 标 定 流 程 &#xff0c; 最 后 列 举 常 见 的 下 线 标 定 失 败 原 因 及 对 策 。 安装在…

Spring Boot 中使用 Redis + Aop 进行限流

Spring Boot 中使用 Redis 进行限流&#xff0c;通常你可以采用如下几种方式&#xff1a; 令牌桶算法&#xff08;Token Bucket&#xff09;漏桶算法&#xff08;Leaky Bucket&#xff09;固定窗口计数器&#xff08;Fixed Window Counter&#xff09;滑动日志窗口&#xff08…

用C++自定义String类

一、头文件 #pragma once #include <iostream>/*** 自定义String类*/ class String { public:String();String(const char *pstr);String(const String &str);~String();String &operator (const String &str);String &operator (const char *pstr);St…

Java:继承

目录 1.继承1.1为什么要使用继承&#xff1f;1.2继承的概念1.3对继承的理解1.4子类怎么访问父类的成员变量1.4.1不同名怎么访问&#xff1f;1.4.2同名怎么访问&#xff1f;(关键字&#xff1a;super) 1.5子类中访问父类的成员方法1.5.1不同名怎么访问&#xff1f;1.5.2同名怎么…

Apache DolphinScheduler-3.2.0集群部署教程

集群部署方案(2 Master 3 Worker) Apache DolphinScheduler官网&#xff1a;https://dolphinscheduler.apache.org/zh-cnApache DolphinScheduler使用文档&#xff1a;https://dolphinscheduler.apache.org/zh-cn/docs/3.2.0截止2024-01-19&#xff0c;最新版本&#xff1a;3…