PostgreSQL数据库中表的物理大小, 妙懂

数据库中表的物理大小

这是一个很有意思的话题。尤其是在我们做物理设计和空间大小评估的时候。

PostgreSQL中对于稍长一点的列,直接使用了TOAST表来存储,默认是会对表中的数据进行压缩的。关于TOAST, 以后或有时间专门做简单介绍。

先看看相关函数的定义:


如果想列一下所有的相关size函数:

 1mydb=# \df pg_*size2                                  List of functions3   Schema   |          Name          | Result data type | Argument data types | Type4------------+------------------------+------------------+---------------------+------5 pg_catalog | pg_column_size         | integer          | "any"               | func6 pg_catalog | pg_database_size       | bigint           | name                | func7 pg_catalog | pg_database_size       | bigint           | oid                 | func8 pg_catalog | pg_indexes_size        | bigint           | regclass            | func9 pg_catalog | pg_relation_size       | bigint           | regclass            | func
10 pg_catalog | pg_relation_size       | bigint           | regclass, text      | func
11 pg_catalog | pg_table_size          | bigint           | regclass            | func
12 pg_catalog | pg_tablespace_size     | bigint           | name                | func
13 pg_catalog | pg_tablespace_size     | bigint           | oid                 | func
14 pg_catalog | pg_total_relation_size | bigint           | regclass            | func
15(10 rows)

这里以table相关size为例,重点介绍一下

 1* pg_size_pretty ( bigint ) → text2这个好理解,对人可读的大小输出3* pg_total_relation_size(regclass)4table大小,但是它同时包括了相关的索引大小以及涉及到的toast表的相应大小。5* pg_table_size ( regclass ) → bigint6这个呢,**把索引大小排除在外**,但是同时包含了**toast**表相应大小,还包括了FSM, VM文件相关的大小7* pg_indexes_size8表的索引的总大小9* pg_relation_size ( relation regclass [, fork text ] ) → bigint
10计算一次"fork"出来的该表大小。注意在大多数情况下,使用更高级的函数 `pg_total_relation_size`或`pg_table_size`更方便,它们将所有分叉(forks)的大小相加。)        使用一个参数,这将返回关系的主数据分叉的大小。第二个参数可以用来指定要检查哪个分叉:        
11--  `main`返回关系的主数据分叉的大小。
12--  `fsm` 返回与该关系关联的空闲空间映射FSM的大小。
13--  `vm` 返回与该关系相关联的可见性映射VM的大小。
14--  `init` 返回初始化分叉的大小,如果有的话,与关系表相关。

一张图总结

用一张图,可以表示如下:

图片

总的计算公式:

table size = relation size (main, fsm, vm , init) + toast table (total size)
total relation size = table_size + index_size

举一个实际的例子:

 1postgres=# alter table t alter col2 set storage external;2ALTER TABLE34CREATE OR REPLACE FUNCTION random_string( int ) RETURNS TEXT as $$5    SELECT string_agg(substring('abcdefghijiklmnopqrstuvwxyz', round(random() * 25)::integer, 1), '') FROM generate_series(1, $1);6$$ language sql;78postgres=# insert into t select n, random_string(3800) ||  n from generate_series(1, 1000) as n;9INSERT 0 1000
10postgres=# select pg_total_relation_size(16435);
11 pg_total_relation_size
12------------------------
13                4186112
14(1 row)
15
16postgres=# select pg_total_relation_size('t') total, pg_table_size('t') table, pg_indexes_size('t') indexes, pg_table_size('t')+pg_indexes_size('t') as sum;
17  total  |  table  | indexes |   sum
18---------+---------+---------+---------
19 4317184 | 4276224 |   40960 | 4317184
20(1 row)
21
22postgres=# select pg_relation_size('t') default, pg_relation_size('t', 'main') main, pg_relation_size('t', 'fsm') fsm, pg_relation_size('t', 'vm') vm, pg_relation_size('t', 'init') init;
23 default | main  |  fsm  | vm | init
24---------+-------+-------+----+------
25   57344 | 57344 | 24576 |  0 |    0
26(1 row)

如何计算对应的toast表相关的空间大小?(思考)

1toast size = <table size> - <relation size (main, fsm, vm , init)>
2从上例中,可以得到toast size = 4276224 - 57344 = 4218880
微信公众号:数据库杂记   个人微信: _iihero
我是iihero. 也可以叫我Sean.
iihero@CSDN(https://blog.csdn.net/iihero) 
Sean@墨天轮 (https://www.modb.pro/u/16258)
iihero@zhihu (https://www.zhihu.com/people/iihero)
数据库领域的资深爱好者一枚。SAP数据库技术专家与架构师,PostgreSQL ACE.
水木早期数据库论坛发起人db2@smth. 早期多年水木论坛数据库版版主。
国内最早一批DB2 DBA。前后对Sybase, PostgreSQL, HANA, 
Oracle, DB2, SQLite均有涉猎。曾长期担任CSDN相关数据库版版主。
三本著作:<<Java2网络协议内幕>> <<Oracle Spatial及OCI高级编程>> 
<<Sybase ASE 15.X全程实践>>
兴趣领域:数据库技术及云计算、GenAI业余专长爱好:中国武术六段 陈式太极拳第13代传人(北京陈式太极拳第5代传人)
职业太极拳教练,兼任北京陈式太极拳研究会副秘书长。
如果想通过习练陈式太极拳强身健体,也可以与我联系。

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

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

相关文章

LabVIEW比例流量阀自动测试系统

LabVIEW比例流量阀自动测试系统 开发了一套基于LabVIEW编程和PLC控制的比例流量阀自动测试系统。通过引入改进的FCMAC算法至测试回路的压力控制系统&#xff0c;有效提升了压力控制效果&#xff0c;展现了系统的设计理念和实现方法。 项目背景&#xff1a; 比例流量阀在液压…

Docker入门到实践之环境配置

Docker入门到实践之环境配置 docker 环境安装 Ubuntu/Debian: sudo apt update sudo apt install docker.ioCentOS/RHEL: sudo yum install dockerArch Linux: sudo pacman -S docker如果未安装成功&#xff0c;或者env的path未设置成功&#xff0c;运行时会报错 Bash: Do…

训练不了AI,怎么办?

即使直接训练人工智能&#xff08;AI&#xff09;模型对许多人来说可能是一个技术上和资源上的挑战&#xff0c;仍然有多种方式可以参与、利用和推动AI技术的发展&#xff0c;而不必直接参与到模型的训练过程中。以下是一些可以考虑的途径&#xff1a; 1. 使用现有的AI服务和工…

每日一题 --- 螺旋矩阵 II[力扣][Go]

螺旋矩阵 II 题目&#xff1a;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出…

强化学习之父Richard Sutton:通往AGI的另一种可能

2019年&#xff0c;强化学习之父、阿尔伯塔大学教授Richard Sutton发表了后来被AI领域奉为经典的The Bitter lesson&#xff0c;这也是OpenAI研究员的必读文章。 在这篇文章中&#xff0c;Richard指出&#xff0c;过去 70 年来&#xff0c;AI 研究的一大教训是过于重视人类既有…

鸿蒙ArkUI【开发移植Carbon】

项目介绍 本项目是基于开源项目[Carbon] 进行harmonyos化的移植和开发的。 移植版本&#xff1a;Branches/master 这不是单纯只是API和基本功能展示demo&#xff0c;它是最有用的自定义控件的实现&#xff0c;如设计规范中所示。 Carbon试图&#xff1a; 让事情变得更简单&…

PySide6-YOLO8目标检测、追踪可视化界面

目录 项目地址实现效果DetectTrack 项目地址 https://github.com/zhengjie9510/pyside-yolo 实现效果 Detect Track

SpringBoot2.x 整合SpringDocJavadocknife4j实现无注解零入侵式接口文档

说明 基于 javadoc 无注解零入侵生成规范的 openapi 结构体。 文档工具使用 由于框架采用 openapi 行业规范 故市面上大部分的框架均支持 可自行选择 例如: apifox apipost postman torna knife4j 等 根据对应工具的文档接入即可 Swagger升级SpringDoc指南 常见功能如下 其他…

网络安全实训Day9

写在前面 访问控制和防火墙桌面端安全检测与防御 网络安全实训-网络安全技术 网络安全概述 访问控制 定义&#xff1a;通过定义策略和规则来限制哪些流量能经过防火墙&#xff0c;哪些流量不能通过。本质是包过滤 可以匹配的元素 IP协议版本 源区域和目的区域 源IP地址和目…

Nature:“量子龙卷风”首次模拟黑洞

科学家们在超流体氦气中首次创造出了一个巨大的“量子漩涡”&#xff08;quantum vortex&#xff09;&#xff0c;用以模拟黑洞。这一成就不仅使他们能够更加细致地观察模拟黑洞的行为&#xff0c;还能探究其与周围环境的交互作用。 诺丁汉大学的研究团队与伦敦国王学院和纽卡斯…

生产力工具|安装更新R软件(R、studio)

内容介绍&#xff1a; 安装R软件&#xff1a; 下载 R X64 3.5.1: 访问官方R网站 https://cran.r-project.org/。选择适合Windows版本的安装包。将安装包下载到您的计算机。 本地安装: 运行下载的“R-3.5.1-win.exe”文件。按照安装向导&#xff0c;选择安装路径&#xff0c;取消…

适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自&#xff1a;设计模式深度解析&#xff1a;适配器模式与桥接模式-灵活应对变…