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

2024-03-24 11:36

本文主要是介绍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代传人)
职业太极拳教练,兼任北京陈式太极拳研究会副秘书长。
如果想通过习练陈式太极拳强身健体,也可以与我联系。

这篇关于PostgreSQL数据库中表的物理大小, 妙懂的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/841468

相关文章

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

MySQL数据库实现批量表分区完整示例

《MySQL数据库实现批量表分区完整示例》通俗地讲表分区是将一大表,根据条件分割成若干个小表,:本文主要介绍MySQL数据库实现批量表分区的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录一、表分区条件二、常规表和分区表的区别三、表分区的创建四、将既有表转换分区表脚本五、批量转换表为分区

MySQL Workbench工具导出导入数据库方式

《MySQLWorkbench工具导出导入数据库方式》:本文主要介绍MySQLWorkbench工具导出导入数据库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录mysql Workbench工具导出导入数据库第一步 www.chinasem.cn数据库导出第二步