当前位置: 首页 > news >正文

PostgreSQL的表碎片

PostgreSQL的表碎片

在 PostgreSQL 中,表碎片化可能会影响数据库性能和存储效率。碎片化通常是由于频繁的插入、更新和删除操作引起的。以下是关于 PostgreSQL 表碎片化的详细信息,包括如何识别和处理表碎片化。

什么是表碎片化?

表碎片化是指表数据在文件系统中的不连续存储,导致读取和写入操作的效率降低。常见原因包括:

  • 频繁的插入和删除:导致数据块中出现“空洞”。
  • 更新操作:由于 PostgreSQL 的 MVCC(多版本并发控制)机制,更新操作会生成新的行版本,原来的空间会被标记为可重用但是不立即回收。

如何检测表碎片化?

表碎片化可以通过分析表和索引的膨胀比例来检测。pg_stat_user_tablespg_relation_size 是两个常用的系统表和函数。

使用 pgstattuple 拓展

pgstattuple 拓展可以详细报告表和索引的使用情况,包括死元组和空闲空间。你需要先安装这个扩展:

CREATE EXTENSION pgstattuple;

然后运行如下查询:

SELECT * FROM pgstattuple('your_table_name');

该查询将返回如下信息:

  • table_len: 表的总大小。
  • tuple_count: 活跃元组数。
  • tuple_len: 活跃元组的总大小。
  • dead_tuple_count: 死元组数(可以视为碎片)。
  • dead_tuple_len: 死元组的总大小。

输出:

white=# select count(*) from yewu1.t1;count  
---------1000000
(1 row)white=# SELECT * FROM pgstattuple('yewu1.t1');table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent 
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------51642368 |     1000000 |  40888896 |         79.18 |                0 |              0 |                  0 |      20928 |         0.04
(1 row)white=# delete from yewu1.t1;
DELETE 1000000
white=# commit;
WARNING:  there is no transaction in progress
COMMIT
white=# SELECT * FROM pgstattuple('yewu1.t1');table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent 
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------51642368 |           0 |         0 |             0 |          1000000 |       40888896 |              79.18 |      20928 |         0.04
(1 row)
使用 pg_stat_user_tablespg_relation_size
SELECT schemaname,relname AS table_name,n_dead_tup AS dead_tuples,pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROMpg_stat_user_tables where relname='t1'
ORDER BYn_dead_tup DESC;

这个查询显示了每个表的死元组计数和表的总大小。死元组计数较高的表可能存在严重的碎片化问题。

如何处理表碎片化?

一般通过以下两种方式处理表碎片化:

  1. VACUUM:
    • VACUUM: 回收死元组空间,但不会重组表。常用于日常维护。
    • VACUUM FULL: 清理并重组表,但会锁表,适用于严重碎片化的情况。
-- 回收死元组空间
VACUUM your_table_name;-- 清理并重组表
VACUUM FULL your_table_name;
  1. REINDEX:
    • 重新创建索引,适用于索引碎片化。
REINDEX INDEX your_index_name;-- 或者重新创建整个表的所有索引
REINDEX TABLE your_table_name;

自动维护

PostgreSQL 提供了自动维护工具:autovacuumautovacuum 会自动清理和优化表,以减少手动维护的需要。你可以通过配置 postgresql.conf 文件中的相关参数来调整其行为:

  • autovacuum: 是否启用自动清理(默认启用)。
  • autovacuum_vacuum_thresholdautovacuum_analyze_threshold: 起始清理和分析的死元组数。
  • autovacuum_vacuum_scale_factorautovacuum_analyze_scale_factor: 起始清理和分析的表大小比例。

这些配置可以通过 SQL 修改:

ALTER SYSTEM SET autovacuum = 'on';
ALTER SYSTEM SET autovacuum_vacuum_threshold = 50;
ALTER SYSTEM SET autovacuum_analyze_threshold = 50;
ALTER SYSTEM SET autovacuum_vacuum_scale_factor = 0.2;
ALTER SYSTEM SET autovacuum_analyze_scale_factor = 0.1;

结论

表碎片化影响数据库性能,通过有效的检测和维护机制,可以显著提升数据库性能。定期执行 VACUUMREINDEX 操作,以及启用并正确配置 autovacuum,将有助于保持数据库的高效运行。

相关文章:

  • 从0新建一个微信小程序实现一个简单跳转
  • label标签,for属性与input的id属性相匹配
  • UE(网络)
  • excel导出图片---HSSFWorkbook--SXSSFWorkbook
  • <Rust>iced库(0.13.1)学习之部件(三十):button部件的使用
  • 为什么vue加载select大量数据会使页面造成卡顿
  • upsample nearest 临近上采样实现方式
  • taobao.item_get_appAPI接口原app数据测试指南
  • unity安装报错问题记录
  • 确保从IP池提取的IP是可用的对于数据抓取或其他网络活动至关重要。以下是一些确保IP可用性的有效方法:
  • 点评项目-3-登录成功后加载登录页面
  • Qt 每日面试题 -6
  • LVS+keepalived整合负载均衡配置
  • 物理学基础精解【41】
  • MySql中索引失效的情况及原因
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JDK9: 集成 Jshell 和 Maven 项目.
  • jquery cookie
  • jQuery(一)
  • Laravel 菜鸟晋级之路
  • leetcode386. Lexicographical Numbers
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Web设计流程优化:网页效果图设计新思路
  • yii2中session跨域名的问题
  • Zepto.js源码学习之二
  • 第十八天-企业应用架构模式-基本模式
  • 分享几个不错的工具
  • 深入浅出webpack学习(1)--核心概念
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 学习HTTP相关知识笔记
  • 移动端解决方案学习记录
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #07【面试问题整理】嵌入式软件工程师
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #pragam once 和 #ifndef 预编译头
  • %@ page import=%的用法
  • %check_box% in rails :coditions={:has_many , :through}
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C++17) optional的使用
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (超详细)语音信号处理之特征提取
  • (附源码)计算机毕业设计大学生兼职系统
  • (九)c52学习之旅-定时器
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (十一)图像的罗伯特梯度锐化
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (学习日记)2024.02.29:UCOSIII第二节
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net 7 上传文件踩坑
  • .net SqlSugarHelper