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.mzph.cn/news/771929.shtml

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

相关文章

javaWeb学生宿舍管理系统

一、摘要 本博客介绍了如何使用Spring Boot和MySQL构建一个功能完善的JavaWeb学生宿舍管理系统。该系统分为三个角色&#xff1a;管理员、宿管和学生。管理员拥有对整个系统的全面管理权限&#xff0c;包括学生管理、宿舍管理、入住管理和管理员管理&#xff1b;宿管负责宿舍的…

3.Python数据分析—数据分析入门知识图谱索引(知识体系中篇)

3.Python数据分析—数据分析入门知识图谱&索引-知识体系中篇 一个人简介二数据获取和处理2.1 数据来源&#xff1a;2.2 数据清洗&#xff1a;2.2.1 缺失值处理&#xff1a;2.2.2 异常值处理&#xff1a; 2.3 数据转换&#xff1a;2.3.1 数据类型转换&#xff1a;2.3.2 数据…

【Java程序设计】【C00360】基于Springboot的考研互助交流平台(有论文)

基于Springboot的考研互助交流平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及i…

java常用应用程序编程接口(API)——IO流概述及字节流的使用

前言&#xff1a; IO流和File是用于把数据存放在硬盘里的工具。File可以把文件存至硬盘&#xff0c;但不能更改里面的数据。通过IO流可以改写硬盘里的数据。整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! IO流 I指Input&#xff0c;称为输入流&#xff1a;负责把…

智慧医疗包括哪些方面?智慧医疗发展前景如何?

近年来&#xff0c;随着云计算、物联网&#xff08;internet of things&#xff0c;IOT&#xff09;、移动互联网、大数据、人工智能&#xff08;artificial intelligence&#xff0c;AI&#xff09;、5G网络、区块链等新一代信息技术的逐步成熟和广泛应用&#xff0c;信息化已…

【码云Git提交】Windows

一、第一次提交 1.登录码云创仓库 2.观察创建后的提示&#xff0c;就有步骤命令了 3.我们在系统中打开一个测试文件夹窗口打开GitBash PS&#xff1a;&#xff08;你需要提前装一个Node&#xff0c;本章不介绍&#xff09; 我们打开一个创建的test测试文件夹窗口&#xff0c;…

阿里 Modelscope 创空间部署在本地环境操作文档

创建创空间的步骤直接跳过。 备注:我的电脑是Windows 第一步&#xff1a;获取创空间代码&#xff0c;直接下载代码太慢了&#xff0c;建议通过git获取代码 第二步:复制链接,打开cmd 直接粘贴回车下载。下载完之后的到了我的Service-Assistant文件夹。再git clone https://gith…

可编程液冷负载的核心功能

可编程液冷负载核心功能在于根据设备的工作状态和环境温度&#xff0c;自动调整冷却液的流量和温度&#xff0c;以实现精确的散热控制。这种技术以其高效、智能的特性&#xff0c;为多个领域提供了全新的散热解决方案。 可编程液冷负载的核心功能在于其可编程性&#xff0c;这意…

【倪琴仲尼式-雷伴】全新倪诗韵精品杉木古琴

试音中的用弦&#xff1a;梦音&#xff0c;视频录音无任何处理&#xff0c;所见即所得。 现琴比照片更好看。倪琴吊牌、琴额后面的编码和倪琴官网上的序列号是一一对应的&#xff0c;可查。 雷伴&#xff0c;“伴”字取意陪伴、相伴、依随。栗壳色&#xff0c;纯鹿角霜生漆工艺…

解决“ModuleNotFoundError: No module named ‘transformers’”错误的全面指南

一、问题背景与原因 在Python编程中&#xff0c;ModuleNotFoundError是一个常见的错误&#xff0c;表明解释器无法在指定的路径或Python环境中找到所需的模块。特别是当我们尝试导入像transformers这样的第三方库时&#xff0c;如果库没有被正确安装&#xff0c;就会遇到这样的…

稀碎从零算法笔记Day28-LeetCode:零钱兑换

前言&#xff1a;鸽了好多天了哈哈哈&#xff0c;虽然C站没更但是LC还是坚持刷的&#xff0c;任重道远啊&#xff01;(可恶的寝室熄灯) 题型&#xff1a;动态规划 链接&#xff1a;322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述…

紫鸾5.0:紫光云新一代敏捷应用开发平台全家桶

曾几何时&#xff0c;“瀑布式”占据了二十世纪软件开发的主流&#xff0c;开发时间往往以年计&#xff0c;一款软件应用动辄几年才能交付。而随着社会生产力的跃升&#xff0c;“瀑布式”已严重跟不上时代的节奏&#xff0c;2001年&#xff0c;“敏捷宣言”的发布&#xff0c;…

微信小程序使用Vant组件库流程

目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。这样开发原生微信小程序的会方便很多。 官方网址&#xff1a;Vant Weapp - 轻量、可靠的小程序 UI 组件库 步骤一 通过 npm 安装 npm i vant/weap…

Matplotlib库的初步理解与使用

matplotlib库的设计哲学&#xff1a; Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python. Matplotlib makes easy things easy and hard things possible. matplotlib是一个用来创建静态&#xff0c;动画&#…

蓝牙信标覆盖范围

蓝牙信标覆盖范围是一个重要的考虑因素&#xff0c;对于蓝牙技术的应用和部署至关重要。了解蓝牙信标的覆盖范围可以帮助我们更好地规划蓝牙设备的布局和位置&#xff0c;从而实现最佳的信号覆盖和传输效果。 首先&#xff0c;我们需要明确蓝牙信标的覆盖范围受到多种因素的影…

10 天 996 写出的语言 - JavaScript

本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 10 天 996 写出的语言 - JavaScript 在 JavaScript 之前&#xff0c;网页主要是静态的&#xff0c;任何交互性都必须在服务器端处理&#xff0c;导致用户体验笨拙和缓慢。JavaScript 的…

C语言与sqlite3入门

c语言与sqlite3入门 1 sqlite3数据类型2 sqlite3指令3 sqlite3的sql语法3.1 创建表create3.2 删除表drop3.3 插入数据insert into3.4 查询select from3.5 where子句3.6 修改数据update3.7 删除数据delete3.8 排序Order By3.9 分组GROUP BY3.10 约束 4 c语言执行sqlite34.1 下载…

Web UI 自动化测试方案(超级干货)看完不会你找我

项目讨论 一、项目中符合自动化测试的部分有哪些&#xff1f;(目标和范围 scope&#xff0c; 准入准出标准) 1、稳定的需求点、变动较少的页面 2、每日构建后的测试验证 daily build 3、比较频繁的回归测试 4、需要在多平台上运行的相同测试案例、组合遍历型的测试、大量的重…

what is apache?

Apache 通常指 Apache Software Foundation (ASF) 或 Apache HTTP Server&#xff0c;两者都是计算机软件领域的重要实体。 Apache 软件基金会 (ASF)&#xff1a;Apache 软件基金会是一个开发开源软件项目的非营利组织。它为涵盖软件开发各个方面的广泛项目提供支持&#xff0c…

3dmax展厅异形模型怎么做---模大狮模型网

在3ds Max中创建展厅异形模型需要一定的建模技巧和创造力。以下是一般的步骤&#xff1a; 准备设计方案&#xff1a; 首先&#xff0c;需要明确展厅的设计方案和概念&#xff0c;包括展厅的整体结构、空间布局和异形特点等。 创建基本结构&#xff1a; 在3ds Max中&#xff…