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.rhkb.cn/news/480808.html

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

相关文章

RHCE作业五-shell脚本

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

分页查询日期格式不对

方式一:在属性上加入注解,对日期进行格式化 方式二:在 WebMvcConfiguration 中扩展Spring MVC的消息转换器,统一对日期类型进行格式化处理 /*** 统一转换处理扩展spring mvc* 后端返回前端的进行统一转化处理* param converters*/Overrideprotected voi…

深度学习3:数据预处理使用Pandas与PyTorch的实践

文章目录 导读一、主题与提纲1.1. 读取数据集1.2. 处理缺失值1.3. 转换为张量格式 二、结论 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容&#xff0…

Tülu 3:重新定义开源大模型的后训练范式

一、引言 在大型语言模型(LLM)的发展历程中,预训练阶段往往受到最多关注,动辄需要数百万美元算力投入和数万亿token的训练数据。然而,一个鲜为人知但同样关键的事实是:预训练完成的模型实际上并不能直接投…

【机器学习】机器学习的基本分类-监督学习-逻辑回归(Logistic Regression)

逻辑回归是一种分类算法,尽管名字中包含“回归”,但其主要用于解决二分类和多分类问题。它通过学习一个逻辑函数,预测输入属于某个类别的概率。 1. 逻辑回归的基本概念 目标 逻辑回归的目标是找到一个函数 h(x),输出一个概率值 …

PyMOL操作手册

PyMOL 操作手册 The man will be silent, the woman will be tears. – itwangyang ​ 翻译整理:itwangyanng 2024 年 11月 29 日 目录 初识 PyMOL… 5 0.1 安装 PyMOL… 5 0.1.1 Windows 系统开源版 PyMOL 的安装… 5 0.1.2 教育版 PyMOL 的下载安装……

麒麟系统x86安装达梦数据库

一、安装准备前工作 操作系统:银河麒麟V10,CPU: x86_64 架构 下载地址,麒麟官网:https://www.kylinos.cn/ 数据库:dm8_20220915_x86_kylin10_64 下载地址,达梦数据库官网:https://…

Hot100 - 搜索二维矩阵II

Hot100 - 搜索二维矩阵II 最佳思路: 利用矩阵的特性,针对搜索操作可以从右上角或者左下角开始。通过判断当前位置的元素与目标值的关系,逐步缩小搜索范围,从而达到较高的效率。 从右上角开始:假设矩阵是升序排列的&a…

docker服务容器化

docker服务容器化 1 引言2 多个容器间网络联通2.1 单独创建关联2.2 创建时关联 3 服务搭建3.1 镜像清单3.2 容器创建 4 联合实战4.2 flink_sql之kafka到starrocks4.2 flink_sql之mysql到starrocks 5 文献借鉴 1 引言 ​ 利用docker可以很效率地搭建服务,本文在win1…

011变长子网掩码

变长子网掩码: 使用变长子网掩码(VLSM)优化地址分配 目标: 根据需求使用VLSM分配IP地址,减少浪费,并配置静态路由。 网络拓扑 创建一个包含三台路由器(R1、R2、R3)和五台PC&#x…

SpringBoot小知识(2):日志

日志是开发项目中非常重要的一个环节,它是程序员在检查程序运行的手段之一。 1.日志的基础操作 1.1 日志的作用 编程期调试代码运营期记录信息: * 记录日常运营重要信息(峰值流量、平均响应时长……) * 记录应用报错信息(错误堆栈) * 记录运维过程数据(…

大数据新视界 -- 大数据大厂之 Hive 数据安全:权限管理体系的深度解读(上)(15/ 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

智能探针技术:实现可视、可知、可诊的主动网络运维策略

网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代,网络运维的重要性不仅体现在技术层面,更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…

RT-DETR融合Inner-IoU及相关改进思路

RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《Inner-IoU: More Effective Intersection over Union Loss with Auxiliary Bounding Box》 一、 模块介绍 论文链接:https://arxiv.org/abs/2311.02877 代码链接&a…

在Springboot项目中实现将文件上传至阿里云 OSS

oss介绍 阿里云对象存储服务(OSS)是一种高效、安全和成本低廉的数据存储服务,可以用来存储和管理海量的数据文件。本文将教你如何使用 Java 将文件上传到阿里云 OSS,并实现访问文件。 1. 准备工作 1.1 开通 OSS 服务 登录阿里云…

Java项目中加缓存

Java项目中加缓存 1.更新频率低;但读写频率高的数据很适合加缓存; 2.可以加缓存的地方很多:浏览器的缓存;CDN的缓存;服务器的缓存; 本地内存;分布式远端缓存; 加缓存的时候不要…

Vuex —— Day1

vuex概述 vuex是vue的状态管理工具,可以帮我们管理vue通用的数据(多组件共享的数据) vuex的应用场景: 某个状态在很多个组件中都会使用(eg.个人信息)多个组件共同维护一份数据(eg.购物车&…

【前端】Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的最佳实践

关于Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的实践内容方面,我们按下面几点进行阐述。 1. 原理 服务器端渲染 (SSR): 在服务器上生成完整的HTML页面,然后发送给客户端。这使得用户在首次访问时能够…

基于FPGA的FM调制(载波频率、频偏、峰值、DAC输出)-带仿真文件-上板验证正确

基于FPGA的FM调制-带仿真文件-上板验证正确 前言一、FM调制储备知识载波频率频偏峰值个人理解 二、代码分析1.模块分析2.波形分析 总结 前言 FM、AM等调制是学习FPGA信号处理一个比较好的小项目,通过学习FM调制过程熟悉信号处理的一个简单流程,进而熟悉…

Scala学习记录,统计成绩

统计成绩练习 1.计算每个同学的总分和平均分 2.统计每个科目的平均分 3.列出总分前三名和单科前三名,并保存结果到文件中 解题思路如下: 1.读入txt文件,按行读入 2.处理数据 (1)计算每个同学的总分平均分 import s…