openGauss你计算的表大小,有包含toast表么?

openGauss你计算的表大小,有包含toast表么?

最近有一个同事问我说“openGauss中pg_relation_size函数在计算表的大小时是否包含了大字段的大小?”,经过思考后,自己觉得表的大小是不包含大字段的大小的,然后通过查看官网的文档说明,该函数含义为指定OID代表的表或者索引所使用的磁盘空间。如果只单独看这条定义,那么还是不清楚是否包含toast表,但是如果你看了数据库对象的其他函数,结合其他函数的解释应该可以得出结论在这里是不包含toast表的大小。即使知道结果了,还是想通过实际操作验证一下openGauss的pg_relation_size函数在计算表大小时未包含toast表大小。关于toast机制在这里就不做详细介绍,有兴趣的同学,可以自行查看相关资料。

准备测试用例

创建测试用例表

create table tbl_blog (id serial primary key,author varchar(50),title varchar(200),content text);

查看表结构

testdb=> \d+ tbl_blogTable "test.tbl_blog"Column  |          Type          |                       Modifiers                       | Storage  | Stats target | Description
---------+------------------------+-------------------------------------------------------+----------+--------------+-------------id      | integer                | not null default nextval('tbl_blog_id_seq'::regclass) | plain    |              |author  | character varying(50)  |                                                       | extended |              |title   | character varying(200) |                                                       | extended |              |content | text                   |                                                       | extended |              |
Indexes:"tbl_blog_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default
Has OIDs: no
Options: orientation=row, compression=no

在这里我们可以看到author、title、content的storage列的值为extended,这是大多数toast数据类型的默认设置,表示允许行外存储和压缩,一般会先压缩,如果还是太大,就会行外存储。这里行外存储其实就是指,当行的记录的长度大于了TOAST_TUPLE_THRESHOLD(值为2KB)时,会触发TOAST,把大字段的列数据存储到TOAST表中。

查看tbl_blog关联的toast表的oid

testdb=> select oid,relname,reltoastrelid from pg_class where relname='tbl_blog';oid  | relname  | reltoastrelid
-------+----------+---------------24608 | tbl_blog |         24612
(1 row)

查询关联的toast表的表名及表数据

--查看toast表名
testdb=# select relname from pg_class where oid = 24612;relname
----------------pg_toast_24608
(1 row)

在这里可以看到TOAST表名,其实就是pg_toast+表的oid。

查看toast表的信息

testdb=# select tableoid ,* from pg_toast.pg_toast_24608;chunk_id | chunk_seq | chunk_data
----------+-----------+------------
(0 rows)
--查看TOAST表结构
testdb=> \d+ pg_toast.pg_toast_24608
TOAST table "pg_toast.pg_toast_24608"Column   |  Type   | Storage
------------+---------+---------chunk_id   | oid     | plainchunk_seq  | integer | plainchunk_data | bytea   | 

这里简单的对toast表的字段说明一下

chunk_id:普通表通过TOAST pointer关联到一个被TOAST的列

chunk_seq:同一个chunk_id如果大于TOAST_MAX_CHUNK_SIZE,将被切片存储。这里存储切片后的序号

chunk_data:真实的数据,但是在这里展示的都是二进制值

模拟数据验证

content字段插入少许值

执行命令插入数据

insert into tbl_blog(author,title,content) values('墨竹','推荐Postgresql中一些好用的psql命令','psql客户端工具应该是dba非常频繁使用的的工具。');

查看表大小和toast表的大小

testdb=# select pg_relation_size(oid) as tb_size,pg_relation_size(reltoastrelid) as toast_size from pg_class where relname='tbl_blog';tb_size | toast_size
---------+------------8192 |          0
(1 row)
--同样在toast表的数据仍然为空
testdb=# select * from pg_toast.pg_toast_24608;chunk_id | chunk_seq | chunk_data
----------+-----------+------------
(0 rows)

在上面查询结果可以看到当插入的值比较小时,在toast表未查询到数据。然后我们再查看content列的长度,为46字节。

testdb=> select pg_column_size(id),pg_column_size(author),pg_column_size(title),pg_column_size(content) from tbl_blog;pg_column_size | pg_column_size | pg_column_size | pg_column_size
----------------+----------------+----------------+----------------4 |              5 |             35 |             46
(1 row)

content字段插入大量值

执行命令插入数据,在这里省略了大量的数据,自行测试的时候,找一些数据就行。

insert into tbl_blog(author,title,content) values('墨竹','推荐Postgresql中一些好用的psql命令','E.1.1. Overview 
PostgreSQL 17 contains many new features and enhancements, including:
....省略大量文字
Add worker type column to pg_stat_subscription (Peter Smith) §');

查看表大小和toast表的大小

testdb=# select pg_relation_size(oid) as tb_size,pg_relation_size(reltoastrelid) as toast_size from pg_class where relname='tbl_blog';tb_size | toast_size
---------+------------8192 |       8192
(1 row)
--在这里由于chunk_data太大不方便展示,就截取了一部分
testdb=> select chunk_id,chunk_seq,substring(chunk_data,0,20) from pg_toast.pg_toast_24608;chunk_id | chunk_seq |                substring
----------+-----------+------------------------------------------24618 |         0 | \x3a35000000452e312e312e204f00766572766924618 |         1 | \x219b6c75652066021387926b946a114457696e24618 |         2 | \x015620ce63113712450475697383ae4380606f24618 |         3 | \x2204a824e26d616e69e47075443a6f66710973
(4 rows)

当再次插入数据时,表的大小未变化,但是toast表的变为了8KB,说明这个时候已经出发toast机制,将content列的数据存储到toast表。当查看toast表中的数据时,发现已经有数据并且由于插入的太大,对插入的数据进行了切分。最后再来查看一下列的长度,为7286字节,确实是需要切分的。

testdb=# select pg_column_size(id),pg_column_size(author),pg_column_size(title),pg_column_size(content) from tbl_blog;pg_column_size | pg_column_size | pg_column_size | pg_column_size
----------------+----------------+----------------+----------------4 |              7 |             45 |             654 |              7 |             45 |           7286
(2 rows)

再次插入数据

再次把第2次的数据重新插入一次

insert into tbl_blog(author,title,content) select author,title,content from tbl_blog where id = 2;

查看表大小和toast表的大小

testdb=> select pg_relation_size(oid) as tb_size,pg_relation_size(reltoastrelid) as toast_size from pg_class where relname='tbl_blog';tb_size | toast_size
---------+------------8192 |      24576
(1 row)
--在这里由于chunk_data太大不方便展示,就截取了一部分
testdb=> select chunk_id,chunk_seq,substring(chunk_data,0,20) from pg_toast.pg_toast_24608;chunk_id | chunk_seq |                substring
----------+-----------+------------------------------------------24618 |         0 | \x3a35000000452e312e312e204f00766572766924618 |         1 | \x219b6c75652066021387926b946a114457696e24618 |         2 | \x015620ce63113712450475697383ae4380606f24618 |         3 | \x2204a824e26d616e69e47075443a6f6671097324620 |         0 | \x3a35000000452e312e312e204f00766572766924620 |         1 | \x219b6c75652066021387926b946a114457696e24620 |         2 | \x015620ce63113712450475697383ae4380606f24620 |         3 | \x2204a824e26d616e69e47075443a6f66710973
(8 rows)

当我们再次对content字段插入大量值时,发现表的大小未变化,但是toast表大小翻了3倍。

查看列的长度

testdb=>  select pg_column_size(id),pg_column_size(author),pg_column_size(title),pg_column_size(content) from tbl_blog;pg_column_size | pg_column_size | pg_column_size | pg_column_size
----------------+----------------+----------------+----------------4 |              5 |             35 |             464 |              5 |             35 |           72864 |              5 |             35 |           7286
(3 rows)

其实通过这三次的插入数据,观察pg_relation_size函数计算表的大小和toast表的大小,其中表的大小一直未变,toast表的大小从0->8192->24576,就可以判断出pg_relation_size函数计算表的大小时是不包含toast表的大小,如果你忽略这点的话,可能导致最终统计的数据不准确。

下面是计算数据库表/索引大小相关的函数。

pg_relation_size(oid)
描述:指定OID代表的表或者索引所使用的磁盘空间。pg_indexes_size(regclass)
描述:附加到指定表的索引使用的总磁盘空间。pg_table_size(regclass)
描述:指定的表使用的磁盘空间,不计索引(但是包含TOAST,自由空间映射和可见性映射)pg_total_relation_size(regclass)
描述:指定的表使用的总磁盘空间,包括所有的索引和TOAST数据

总结

从这个测试实验中,我们就可以很清晰的知道,pg_relation_size函数只统计表对象的大小,未包含toast表大小,因此如果我们需要统计表大小,建议使用pg_total_relation_size函数更精确一点,该函数的统计包括了索引和toast表;另外如果你使用了pg_table_size来统计表大小,需要注意该统计不包含索引,可能需要使用pg_indexes_size来单独计算索引的大小。

参考
https://github.com/digoal/blog/blob/master/201103/20110329_01.md

本文作者:墨竹

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

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

相关文章

【老白学 Java】Warship v2.0(七)

Warship v2.0(七) 文章来源:《Head First Java》修炼感悟。 上一篇文章中,Warship v2.0 项目最后一个类的完成,意味着整个项目也即将结束。 本篇文章的主要内容是编译、调试所有代码,以及进行代码整理。 如…

Elasticearch索引mapping写入、查看、修改

作者:京东物流 陈晓娟 一、ES Elasticsearch是一个流行的开源搜索引擎,它可以将大量数据快速存储和检索。Elasticsearch还提供了强大的实时分析和聚合查询功能,数据模式更加灵活。它不需要预先定义固定的数据结构,可以随时添加或修…

基于matlab程序实现人脸识别

1.人脸识别流程 1.1.1基本原理 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。…

家校通小程序实战教程04教师管理

目录 1 创建数据源2 搭建管理后台3 搭建查询条件4 功能测试总结 我们上一篇介绍了如何将学生加入班级,学生加入之后就需要教师加入了。教师分为任课老师和班主任,班主任相当于一个班级的管理员,日常可以发布各种任务,发布接龙&…

【力扣】541.反转字符串2

问题描述 思路解析 每当字符达到2*k的时候,判断,同时若剩余字符>k,只对前k个进行判断(这是重点)因为字符串是不可变变量,所以将其转化为字符串数组,最后才将结果重新转变为字符串 字符串->字符数组 …

【vue-router】Vue-router如何实现路由懒加载

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

hdlbits系列verilog解答(Exams/m2014 q4a)-86

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节学习如何下图中的锁存器电路。 注意图中电路是锁存器,因此quartus会警告说推导出一个锁存器。 模块声明 module top_module ( input d, input ena, output q); 思路: 锁存器是一种对脉冲电平敏感的存储…

成都睿明智科技有限公司抖音电商服务的新引擎

在这个短视频风起云涌的时代,抖音不仅成为了人们休闲娱乐的首选,更是商家们竞相角逐的电商新蓝海。在这片充满机遇与挑战的海域中,成都睿明智科技有限公司如同一艘装备精良的航船,引领着众多企业向抖音电商的深水区进发。今天&…

leetcode:637二叉树的层平均值

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[3.00000,14.50000,11.00000] 解释:第 0 层的平均值为 …

Java多线程介绍及使用指南

“多线程”:并发 要介绍线程,首先要区分开程序、进程和线程这三者的区别。 程序:具有一定功能的代码的集合,但是是静态的,没有启动运行 进程:启动运行的程序【资源的分配单位】 线程:进程中的…

独家|京东调整职级序列体系

原有的M、P、T、S主序列将正式合并为新的专业主序列P。 作者|文昌龙 编辑|杨舟 据「市象」独家获悉,京东已在近日在内部宣布对职级序列体系进行调整,将原有的M、P、T、S主序列正式合并为新的专业主序列P,合并后的职级体系将沿用原有专业序…

mysql 存储结构的进化之路

文章目录 前言一、线性结构二、二叉树(BST)三、平衡二叉树(AVL)四、多路平衡查找树(B Tree)五、加强版多路平衡查找树(B Tree)总结 前言 树形结构是一种具有层次关系的数据结构&…

RHCE作业五-shell脚本

一要求: 通过shell脚本分析部署nginx网络服务 1.接收用户部署的服务名称 2.判断服务是否安装 ​ 已安装;自定义网站配置路径为/www;并创建共享目录和网页文件;重启服务 ​ 没有安装;安装对应的软件包 3.测试 判断服务…

Java基础之控制语句:开启编程逻辑之门

一、Java控制语句概述 Java 中的控制语句主要分为选择结构、循环结构和跳转语句三大类,它们在程序中起着至关重要的作用,能够决定程序的执行流程。 选择结构用于根据不同的条件执行不同的代码路径,主要包括 if 语句和 switch 语句。if 语句有…

CSS新特性(11)

一.计算盒子宽度calc函数,可以用加减乘除来计算 -*/ 让父盒子永远比子盒子小30像素 二.CSS3过渡transition搭配hover一起使用 该盒子宽度可以从200px到400px,谁做变化给谁加 不仅要写宽还要写高利用逗号,多个属性一起写都用逗号 既想要宽度变又想要高度…

MacOS 配置github密钥

MacOS 配置github密钥 1. 生成GitHub的SSH密钥对 ssh-keygen -t ed25519 -C "xxxxxxx.com" -f ~/.ssh/id_ed25519_github 其中 xxxxxxxxxxx.com 是注册github、gitee和gitlab的绑定账号的邮箱 -t ed25519:生成密钥的算法为ed25519(ed25519比rsa速度快&…

linux cenos redis 单机部署

编译安装redis(Centos) 编译安装前先安装编译基础环境: yum install -y gcc gcc-c yum install -y readline-devel yum install -y zlib-devel yum -y install pcre yum -y install pcre-devel yum -y install openssl yum -y instal…

TI毫米波雷达(七)——high accurary示例分析(二)

概述 之前分析了IWR6843上的高精度测距程序框架,虽然可以看到大致的系统运行过程,但是总有一种“混乱”的感觉。TI为了展现ARM与DSP协作能力将如此“简单”的一个功能分布在多处理器上,结合BIOS以及semaphore、event、mailbox等机制&#xff…

鸿蒙修饰符

文章目录 一、引言1.1 什么是修饰符1.2 修饰符在鸿蒙开发中的重要性1.3 修饰符的作用机制 二、UI装饰类修饰符2.1 Styles修饰符2.1.1 基本概念和使用场景2.1.2 使用示例2.1.3 最佳实践 2.2 Extend修饰符2.2.1 基本概念2.2.2 使用示例2.2.3 Extend vs Styles 对比2.2.4 使用建议…

架构-微服务-服务配置

文章目录 前言一、配置中心介绍1. 什么是配置中心2. 解决方案 二、Nacos Config入门三、Nacos Config深入1. 配置动态刷新2. 配置共享 四、nacos服务配置的核心概念 前言 服务配置--Nacos Config‌ 微服务架构下关于配置文件的一些问题: 配置文件相对分散。在一个…