PostgreSQL - 查看表膨胀空间

目录

使用pgstattuple插件查看表膨胀空间

死元组&膨胀系数清理

查看表占用磁盘空间大小是如何组成的

什么是fms和vm?

什么是TOAST?

查看表和其关联的TOAST表的oid的关系

方法一

方法二

参考文档


使用pgstattuple插件查看表膨胀空间

select *,1.0 - tuple_len::numeric / table_len as bloat from pgstattuple('table_name');

table_len bigint

物理关系长度(以字节为单位)
tuple_count bigint存活元组数量
tuple_len bigint活动元组的总长度(以字节为单位)
tuple_percent float8存活元组的百分比
dead_tuple_count bigint死元组数量
dead_tuple_len bigint死元组的总长度(以字节为单位)
dead_tuple_percent float8死亡元组的百分比
free_space bigint总可用空间(以字节为单位)
free_percent float8可用空间百分比
bloat表膨胀系数

死元组&膨胀系数清理

  • 使用vacuum命令,可以清理死元组,但是膨胀系数不会降低。因为该命令不会将磁盘空间返回给操作系统,但是新的数据可以复用空间。
  • 使用vacuum full命令,可以降低膨胀系数。因为该命令会将磁盘空间返回给操作系统,但是会产生独立锁,导致清理期间表不可用。且清理期间磁盘使用空间最多会翻倍,因为操作是将有用的数据写到一个新的表里,结束后删除旧表,释放空间。

其他详细死元组&膨胀系数清理的信息,可以参考:postgresql磁盘空间清理

查看表占用磁盘空间大小是如何组成的

select pg_relation_size('table_name', 'main') as main, \
                pg_relation_size('table_name', 'fsm') as fsm, \
                pg_relation_size('table_name', 'vm') as vm, \
                pg_relation_size('table_name', 'init') as init, \
                pg_relation_size('table_name') as pg_relation_size, \
                pg_total_relation_size('toast_oid') as toast, \
                pg_table_size('table_name') as pg_table_size, \
                pg_indexes_size('table_name') as pg_indexes_size, \
                pg_total_relation_size('table_name') as pg_total_size;
mainfsmvminitpg_relation_sizetoastpg_table_sizepg_indexes_sizepg_total_size
31562310451277602816902758403156231045122504810496318214545408137802727424456017272832

关联关系:

  • main = pg_relation_size ;其实pg_relation_size('table_name')就是pg_relation_size('table_name', 'main')的简写
  • 表占空间的大小 = main + fsm + vm + init + toast = pg_table_size
  • 索引占空间的大小 = pg_indexes_size
  • 表真实占用磁盘空间 = 表占空间的大小 + 索引占空间的大小 = pg_table_size + pg_indexes_size

什么是fms和vm?

空闲空间映射(FSM) - free space maps 
每一个表和索引(除了哈希索引)都有一个空闲空间映射(FSM)来保持对关系中可用空间的跟踪;
它伴随着主关系数据被存储在一个独立的关系分支中,以关系的文件节点号加上一个_fsm后缀命名;

FSM文件是执行VACUUM操作时,或者是为了插入行而第一次查询FSM文件时才会创建;

可见性映射(VM) - visual map
每一个表都有一个可见性映射(VM)用来跟踪哪些页面只包含已知对所有活动事务可见的元组,它也跟踪哪些页面只包含未被冻结的元组;
它伴随着主关系数据被存储在一个独立的关系分支中,以该关系的文件节点号加上一个_vm后缀来命名。

VM文件中为每个数据块设置了一个标志位,用来标记数据块中是否存在需要清理的行。
有了这个文件后,通过VACUUM命令扫描这个 文件时,如果发现VM文件中这个数据块上的位表示该数据块没有需要清理的行,则会跳过对这个数据块的扫描,从而加快VACUUM清理的速度。

什么是TOAST?

TOAST(超尺寸属性存储技术-The Oversized-Attribute Storage Technique)。

PostgreSQL使用固定的页面尺寸(通常是8kB),并且不允许元组跨越多个额页面。因此不可能直接存储非常大的域值。为了克服这个限制,大的域值会被压缩并/或分解成多个物理行。这些处理对用户都是透明的,只是在大部分的后端代码上有一些小的影响。这个技术的昵称是TOAST(或者“切片面包之后的最好的东西”)。TOAST 机制也被用来提升内存中大型数据值的处理。

查看表和其关联的TOAST表的oid的关系

数据库表和TOAST表的信息都在pg_class表中

数据库表信息所在行记录了:表的oid,表名,表关联的TOAST表的oid

TOAST表信息所在的行记录了:TOAST表的oid,TOAST表的表名

方法一

一条语句直接导出表和其TOAST表的关联关系

SELECT
  c.relname AS "main_table",
  c.oid AS "main_table_oid",
  t.relname AS "toast_table",
  t.oid AS "toast_table_oid"
FROM pg_class c
JOIN pg_class t ON c.reltoastrelid = t.oid
WHERE c.relkind = 'r';

方法二

1.查询表、表oid,和其关联的TOAST表的oid

select oid,relname,reltoastrelid from pg_class where relname = 'table_name';

2.使用TOAST表的iod,查询TOAST表的信息

(其实一般情况下,有了TOAST表的oid就够用了)

select oid,relname from pg_class where oid = 'toast_iod';

参考文档

Pgsql表膨胀的产生及处理(oracle,postgres) - AI牛丝

pg_relation_size,pg_table_size,pg_indexes_size,pg_total_relation_size之间的关系-CSDN博客

PostgreSQL 之 FSM和VM的理解_vacuum命令通过扫描后缀为_fsm的文件可以加快vacuum进程-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 使用element plus 菜单时,折叠文字不消失

问题: 菜单折叠时,title文本无法消失,同时下拉箭头还会存在 解决方法: 查看项目中是否有div标签 原因 div和p标签都是块级元素,可能是这个原因 所以把项目中的p标签改为span标签 div改为template即可解决

TypeScript(四)枚举类型(Enum Types),类型别名(Type),运算符

一、枚举类型 使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。 枚举类型的特点 可以给一组数值取上一个更好理解的名字;一个枚举中只会存在几个固定的值,并不会…

设计模式:软件开发的秘密武器

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Python基础快速入门

Python基础快速入门 前置知识 Python Python是一种广泛使用的高级编程语言,以其易于学习和使用的语法而闻名。以下是Python的一些主要特点: 高级语言:Python是一种高级语言,这意味着它提供了较高层次的抽象,使编程更…

Hack The Box-Crafty

目录 信息收集 rustscan whatweb WEB 漏洞利用 漏洞说明 漏洞验证 提权 get user.txt get Administrator 总结 信息收集 rustscan ┌──(root㉿ru)-[~/kali/hackthebox] └─# rustscan -a 10.10.11.249 --range0-65535 --ulimit5000 -- -A -sC [~] Automatically…

【好书推荐-第十一期】《Java面试八股文:高频面试题与求职攻略一本通(视频解说版)》(博文视点出品)

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号:洲与AI。 🎈 本文专栏:本文收录…

【Linux进阶之路】网络 —— “?“ (下)

文章目录 前言一、概念铺垫1.TCP2.全双工 二、网络版本计算器1. 原理简要2. 实现框架&&代码2.1 封装socket2.2 客户端与服务端2.3 封装与解包2.4 请求与响应2.5 对数据进行处理2.6 主程序逻辑 3.Json的简单使用 总结尾序 前言 在上文我们学习使用套接字的相关接口进行了…

数据结构入门(3)2.链表接口实现

目录 前言 头文件 动态申请一个结点 单链表打印 单链表尾插 单链表的头插 单链表的尾删 单链表头删 单链表查找 单链表在pos位置之后插入x 单链表删除pos位置之后的值 在pos的前面插入 删除pos位置 销毁顺序表 前言 本文将介绍链表常见的功能的实现 头文件 #…

【深度学习】Lora

论文标题:LoRA: Low-Rank Adaptation of Large Language Models 论文链接:https://arxiv.org/abs/2106.09685 论文来源:NVIDIA 1.提出背景 自然语言处理的一个重要范式为使用领域数据对模型进行大规模的预训练 ,并适应特定的任务或…

LLM PreTraining from scratch -- 大模型从头开始预训练指北

最近做了一些大模型训练相关的训练相关的技术储备,在内部平台上完成了多机多卡的llm 预训练的尝试,具体的过程大致如下: 数据准备: 大语言模型的训练依赖于与之匹配的语料数据,在开源社区有一群人在自发的整理高质量的语料数据,可以通过 以下的一些链接获取 liwu/MNBVC…

全面认识计算机操作系统(二)

目录 一、操作系统的诞生 相关概念: 1. 手工操作阶段 2. 脱机输入 / 输出阶段 (1)脱机输入技术 (2)脱机输出技术 3. 单道批处理阶段 4. 多道批处理阶段 5. 分时技术产生 6. 实时系统产生 二、现代操作系统的…

就业班 2401--3.11 Linux Day15--ftp数据传输测试server和client+谷歌验证码登录远程连接

文件服务器 路漫漫其修远兮,吾将上下而求索.构建NFS远程共享存储 一、NFS介绍 文件系统级别共享(是NAS存储) --------- 已经做好了格式化,可以直接用。 速度慢比如:nfs,sambaNFS NFS:Networ…

vue3项目安装unplugin-auto-import插件实现按需导入API

1、安装unplugin-auto-import npm i -D unplugin-auto-import2.vite.config.ts文件进行配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import AutoImport from unplugin-auto-import/vite// https://vitejs.dev/config/ export default defineCo…

低代码平台如何选型 盘点国内外主流低代码开发平台

随着数字化转型的加速,低代码开发平台作为一种新型软件开发方式,受到了广泛关注。国内低代码市场也呈现出蓬勃发展的态势,各种低代码平台如雨后春笋般涌现。本文将对国内低代码平台进行盘点,以帮助企业和开发者更好地了解市场情况…

亚马逊多账号怎么防关联?超级浏览器来帮你!

很多做亚马逊跨境电商的小伙伴都会遇到的问题就是多登店铺账号被关联,我们要知道,如果在亚马逊上运营多个店铺,保持账户之间的独立性是很重要的。一旦账户之间被平台识别为关联,不仅可能导致收入损失,还可能面临账号被…

鸿蒙开发(四)-低代码开发

鸿蒙开发(四)-低代码开发 本文主要介绍下鸿蒙下的低代码开发。 鸿蒙低代码是指在鸿蒙操作系统进行应用开发时,采用简化开发流程和减少编码量的方式来提高开发效率。 1:开启低代码开发 首先我们打开DevEco Studio .然后创建工程。 如图所示&#xff…

Java网络编程详解

目录 网络编程 1、概述 2、网络通信的要素 3、IP 4、端口 5、通信协议 6、TCP 文件上传 Tomcat 7、UDP 单方发送单方接受 双方发送接收 8、URL URL测试 URL下载网络资源 网络编程 1、概述 信件: 计算机网络: 计算机网络是指将地理位置不…

微服务配置中心

什么是配置中心 配置中心是一种用于管理应用程序或系统配置信息的中央服务。它允许开发人员在多个环境(如开发、测试、生产)之间共享配置,并且可以在不停止应用程序的情况下动态更新配置。 配置中心是统一管理各种应用配置的工具。它能够集中…

导出谷歌浏览器收藏的网页,并查看网页保存的登录密码

导出谷歌浏览器(Chrome)收藏的网页(书签): 打开谷歌浏览器。在浏览器右上角找到并点击三个垂直排列的小点(或称汉堡菜单)以打开主菜单。在下拉菜单中选择“书签” > “书签管理器”。在书签…

R语言扩展包与MaxEnt模型的集成:实现高效的物种分布模拟

在生态学研究中,物种分布模拟是一项至关重要的任务。它有助于我们理解物种与环境之间的复杂关系,预测物种在气候变化或人类活动影响下的潜在分布变化。近年来,随着计算机技术的不断发展,基于机器学习的物种分布模拟方法逐渐成为研…