PG获取文件大小的方式

简介: PG获取文件大小的方式

有三种方式,下面依次介绍。


1、通过元命令获取表文件大小


通过\dt+可以得到该表大小。该元命令会转换成SQL语句去执行,实际上是通过pg_table_size函数进行获取。该函数调用calulate_table_size(rel)其中rel为表的描述结构Relation。通过这个方式计算表大小包括fsm、vm文件大小,如果有toast索引,还包括toast表大小。那么具体获取文件大小的方式是什么呢?看calculate_relation_size函数:最终通过stat函数来获取,这个得到的是文件大小,而不是占用磁盘大小。同样,对于toast索引也是通过这种方式计算得到。


2、内部计算表有多少页


通过RelationGetNumberOfBlocks只计算表主文件的多少页,调用函数RelationGetNumberOfBlocksInFork进行计算。该函数对于序列、索引或者分区索引,直接通过smgrnblocks->mdnblocks获得,对于表、toast和物化视图,调用函数table_relation_size计算出文件大小然后除以一页大小得到多少页。table_relation_size调用heapam_relation_size->smgrnblocks,和上一个方法不同之处在于是否需要包括fsm、vm在内


3、内部估算表大小


通过estimate_rel_size->table_relation_estimate_size->heapam_estimate_rel_size估算表有多少页、多少记录:


curpages = RelationGetNumberOfBlocks(rel);//真实多少页
//pg_class中统计的多少页和多少记录
relpages = (BlockNumber) rel->rd_rel->relpages;
reltuples = (double) rel->rd_rel->reltuples;
//真实页数少于10,真实记录少于0,且无子表,那么估算页数为10
if (curpages < 10 && reltuples < 0 && !rel->rd_rel->relhassubclass)
   curpages= 10;
if (curpages == 0){//当前0页,那么0个记录
   *tuples= 0;
}
if (reltuples >= 0 && relpages> 0)
   density= reltuples / (double) relpages;//统计平均每页多少记录
else{
   tuple_width = get_rel_data_width(rel,attr_widths);
   tuple_width += overhead_bytes_per_tuple;
   density = usable_bytes_per_page /tuple_width;
}
*tuples = rint(density * (double) curpages);
目录
相关文章
|
NoSQL MongoDB
MongoDB compact 命令详解
为什么需要 compact 一图胜千言 remove 与 drop 的区别 MongoDB 里删除一个集合里所有文档,有两种方式 db.collection.remove({}, {multi: true}),逐个文档从 btree 里删除,最后所有文档被删除,但文件物理空间不会被回收 db.
|
8月前
|
前端开发 Java API
Spring MVC 数据绑定机制详解:@ModelAttribute vs. @RequestParam 和 @PathVariable
本文深入解析了Spring MVC的数据绑定机制,重点对比了`@RequestParam`、`@PathVariable`和`@ModelAttribute`三种注解的使用场景与功能。`@RequestParam`适用于从查询参数或表单数据中提取简单值;`@PathVariable`用于从URL路径中获取资源标识符;而`@ModelAttribute`则能将多个请求参数自动绑定到Java对象,支持复杂数据结构的处理。通过实际案例分析,帮助开发者根据需求选择合适的注解,提升API设计与表单处理效率。
619 9
|
5月前
|
存储 人工智能 数据处理
Flink Forward Asia 2025 主旨演讲精彩回顾
Flink Forward Asia 2025 在新加坡开幕,聚焦实时数据与 AI 融合。Apache Flink 推出新子项目 Flink Agents,支持系统触发的 AI Agent 应用,提升实时处理能力。Flink 2.0 实现存算分离,迈向云原生架构。Paimon 支持多模态数据存储,Fluss 成为面向 AI 的流表存储系统。大会展现 Flink 生态全面拥抱 AI 的未来方向。
525 1
Flink Forward Asia 2025 主旨演讲精彩回顾
|
4月前
|
弹性计算 数据中心 UED
阿里云弹性公网IP线路类型【BGP(多线)_精品】是什么意思?
阿里云弹性公网IP的BGP(多线)_精品线路是一种优化海外回中国内地流量的公网线路,具备低时延、高稳定性优势,适用于中国内地用户访问海外部署的业务,如Web服务在中国香港等地域时,可显著提升访问体验。支持按量付费和包年包月模式,地域覆盖中国香港及多个亚太地区。
813 1
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
924 0
|
SQL 关系型数据库 MySQL
MySQL Hints:控制查询优化器的选择
MySQL Hints:控制查询优化器的选择
|
API UED 容器
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
在这篇博客中,我们将深入探讨 Element UI 中的自定义滚动条及弹出层管理技巧。文章详细介绍了 el-scrollbar 组件的使用和参数设置,以及 PopupManager 如何有效管理弹出层的 z-index。我们还将探讨如何实现灵活的全屏组件,利用 vue-popper 创建自定义弹出层,最后介绍 ClickOutside 指令的用法。这些高级技巧将帮助你提升 Element UI 应用程序的用户体验与交互灵活性。
1368 1
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
|
Kubernetes 前端开发 分布式数据库
工作中常见的软件系统部署架构
在实际应用中,会根据项目的具体需求、规模、性能要求等因素选择合适的部署架构,或者综合使用多种架构模式来构建稳定、高效、可扩展的系统。
1145 2
|
Shell
shell获取命令输出和返回值
shell获取命令输出和返回值
2758 0