postgresql表膨胀处理之pgcompacttable部署及使用

news2024/9/27 23:34:17

环境:

1)redhat-release:CentOS Linux release 7.6.1810 (Core)

2)database version:postgresql 14.6

一、添加pgstattuple

pgcompacttable工具使用过程中需要依赖pgstattuple,因此需先添加pgstattuple。如果是源码安装的postgresql,则源码里包含了postgresql-contrib,因此,进行编译及安装即可。

--编译

cd /postgresql/soft/postgresql-14.6/contrib/pgstattuple

make

make  install

本次实验没有编译也可以直接使用。

--在所需要使用的数据库里添加pgstattuple。

[postgres@tencent ~]$ psql -d testdb -Utest

psql (14.6)

Type "help" for help.

testdb=# select * from pg_available_extensions where name like 'pgstat%';

    name     | default_version | installed_version |           comment

-------------+--------------+---------------+--------------------

 pgstattuple | 1.5             |               | show tuple-level statistics

(1 row)

testdb=#create extension pgstattuple;

CREATE EXTENSION

testdb=# select * from pg_available_extensions where name like 'pgstat%';

    name     | default_version | installed_version |           comment

-------------+-----------------+-------------------+-----------------------------

 pgstattuple | 1.5             | 1.5               | show tuple-level statistics

(1 row)

安装完成后,installed_version显示安装的版本

--查看pgstattuple可使用的函数

testdb=# \dxS+ pgstattuple

  Objects in extension "pgstattuple"

          Object description

---------------------------------------

 function pg_relpages(regclass)

 function pg_relpages(text)

 function pgstatginindex(regclass)

 function pgstathashindex(regclass)

 function pgstatindex(regclass)

 function pgstatindex(text)

 function pgstattuple_approx(regclass)

 function pgstattuple(regclass)

 function pgstattuple(text)

(9 rows)

二、部署pgcompacttable

安装前需要安装pgstattuple插件,因为要基于该插件去查找膨胀的表,所以如果有大表的情况下,因为pgstattuple会扫全表,所以会比较耗时,这个在使用的时候一定要注意一下。

原理:

从表的头部填充新的行,在普通vacuum时候,截断表末尾的空page,达到收缩空间的效果。不需要占用额外的空间,使得表文件更加紧凑。而且不会加比较重的锁。对性能影响较小。

--安装依赖包

[root@tencent ~]# yum install perl-Time-HiRes perl-DBI perl-DBD-Pg –y

--上传解压安装包

上传pgcompacttable-master.zip 到/postgresql/soft目录,unzippgcompacttable-master.zip

--查看文件

[postgres@tencent soft]$ cd pgcompacttable-master/

[postgres@tencent pgcompacttable-master]$ ls

bin  README.md

[postgres@tencent pgcompacttable-master]$ cd bin

[postgres@tencent bin]$ ls

Pgcompacttable

三、准备测试环境

3.1 创建表

--创建表

testdb=#create table test (id in,sex char(2),name varchar(10),now_address text,address text);

--插入数据

testdb=# insert into test values(generate_series(1,10000),repeat(chr(int4(random()*26)+65),1),repeat(chr(int4(random()*26)+65),6),repeat(chr(int4(random()*26)+65),30),repeat(chr(int4(random()*26)+65),30));

INSERT 0 10000

--创建索引

testdb=# create index on test(id,sex);

CREATE INDEX

testdb=# create index on test(name,now_address,address);

CREATE INDEX

--查看表大小

testdb=# select pg_size_pretty(pg_relation_size('test'));

 pg_size_pretty

----------------

 1072 kB

(1 row)

testdb=# select count(*) from test;

 count

-------

 10000

(1 row)

3.2 模拟修改数据

创建脚本:

[postgres@tencent scripts]$ vi test_mod.sh

#!/bin/bash

#version:  1.0

#function: bulk update data

for((i=1;i<=10000;i++));

do

    a=`tr -dc A-Z[ < /dev/urandom | head -c1`

    psql -Utest -h 127.0.0.1 -d testdb -c "update test set name=repeat( chr(int4(random()*26)+65),6),now_address=repeat( chr(int4(random()*26)+65),30),address=repeat( chr(int4(random()*26)+65),30)  where sex='$a';" >>/dev/null

    if [ $? == 0 ]

       then

           echo "$a is ok" >>update.log

       else

           echo "$a is close" >>update.err.log

       exit 1;

    fi

done

3.3 膨胀再现

为了执行脚本不输入密码,创建了.pgpass文件

--查看postgres家目录

[postgres@tencent bin]$ grep postgres /etc/passwd

postgres:x:601:601::/home/postgres:/bin/bash

--创建.pgpass

touch /home/postgres/.pgpass

chown postgres. /home/postgres/.pgpass

chmod 600 /home/postgres/.pgpass

--配置.pgpass

[postgres@tencent ~]$ echo "127.0.0.1:4519:testdb:test:test" >>./.pgpass

--连接测试

[postgres@tencent ~]$ psql -h 127.0.0.1 -d testdb -Utest

psql (14.6)

Type "help" for help.

testdb=#

连接成功。

--执行批量修改脚本

[postgres@tencent scripts]$ sh test_mod.sh

--查看元组的统计信息

testdb=# SELECT * FROM pgstattuple('test');

 table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent

--------+-------+------+-------+------+------+------+-------+---

 27795456 | 10258 | 1025800 | 3.69 | 19617 |  1961700 | 7.06 | 24071216 |   86.6

(1 row)

pgstattuple 输出列如下:

    字段              类型            描述

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       空闲空间的百分比

 

--查看表的大小

testdb=# select pg_size_pretty(pg_relation_size('test'));

 pg_size_pretty

----------------

 27 MB

(1 row)

存1w条数据原表大小1096 KB,目前27MB

四、pgcompacttable使用

pgcompacttable可以对database级别、schema级别、table级别进行压缩

./pgcompacttable -h localhost -U postgres -d testdb

./pgcompacttable -h localhost -U postgres -d testdb  -n test

./pgcompacttable -h localhost -U postgres -d testdb -n test -t test

[postgres@tencent bin]$ ./pgcompacttable -h 127.0.0.1 -U test -d testdb

 

--查看压缩后的表

testdb=# SELECT * FROM pgstattuple('test');

 table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent

-----------+----------+-----------+---------+---------+----------+----------+--------+-------

1114112 |    10000 |   1000000 |    89.76 |     0 |      0 |                  0 |   12456 |     1.12

(1 row)

testdb=# select pg_size_pretty(pg_relation_size('test'));

 pg_size_pretty

----------------

 1088 kB

(1 row)

恢复至源表大小。

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

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

相关文章

[C++]01.基础,数据类型,运算符

01.基础,数据类型,运算符 一.C基础入门1.HelloWorld2.注释3.变量4.常量5.关键字6.命名规则 二.数据类型1.整形2.sizeof关键字3.浮点型4.字符型5.转义字符6.字符串型7.布尔类型8.数据的输入 三.运算符1.算数运算符2.赋值运算符3.比较运算符4.逻辑运算符 一.C基础入门 1.HelloWo…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 4

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

力扣 C++|一题多解之动态规划专题(1)

动态规划 Dynamic Programming 简写为 DP&#xff0c;是运筹学的一个分支&#xff0c;是求解决策过程最优化的过程。20世纪50年代初&#xff0c;美国数学家贝尔曼&#xff08;R.Bellman&#xff09;等人在研究多阶段决策过程的优化问题时&#xff0c;提出了著名的最优化原理&…

【习题】几道二叉树题目,进来看看你会不?

几道二叉树题目解析 前言正式开始1. 根据二叉树创建字符串&#xff08;力扣606&#xff09;题目描述解析代码 2. 二叉树的层序遍历1&#xff08;力扣102&#xff09;题目描述解析代码 3. 二叉树的层序遍历2&#xff08;力扣107&#xff09;代码 4. 二叉树的最近公共祖先&#x…

接口测试之json中的key获取

在很多情况下我们在进行接口测试的时候都会有获取上个接口返回的json数据中的某个key值&#xff0c;然后下个接口调用这个key值。今天给大家讲解一下针对不同类型的json获取某个key的值。 一、首先是单纯object格式key值获取 获取图中的token的值&#xff0c;首先这是一个响应…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)【四】

文章目录 SSM(Vue3ElementPlusAxiosSSM前后端分离)--基础环境搭建【四】项目介绍项目功能/界面● SSM 整合项目界面 创建表&#xff0c;使用逆向工程生成Bean、XxxMapper 和XxxMapper.xml1. 创建furns_ssm 数据库和furns 表使用MyBatis Generator 逆向工程生成bean mapper 接口…

基于Jonswap谱的随机波高及波压力生成

内容目录 基于Jonswap谱的随机波高及波压力生成基于Jonswap谱的随机波高及波压力生成 海面高程可视为是平稳高斯随机过程,可通过对波浪谱确定的一系列分量波进行叠加得到。JONSWAP谱是在海洋结构设计和分析中常用的波浪频谱,可以用其来模拟随机波浪。 式中:有义波高H1/3和…

GPIO简介

一、GPIO GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出&#xff0c;GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连&#xff0c;从而实现与外部硬件设备的通讯、控制及信号采集等功能 LED实验步骤 实验步骤 以L…

1. CUDA中的grid和block

1. CUDA中的grid和block基本的理解 Kernel: Kernel不是CPU&#xff0c;而是在GPU上运行的特殊函数。你可以把Kernel想象成GPU上并行执行的任务。当你从主机&#xff08;CPU&#xff09;调用Kernel时&#xff0c;它在GPU上启动&#xff0c;并在许多线程上并行运行。 Grid: 当你…

C高级【day2】

思维导图&#xff1a; 递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位&#xff1a; #include<myhead.h>//递归函数 void fun(int num){//num没值不再递归if(0 num){return;}//输出数的最后一位printf("%d\t", num%10);//递归fun(num/10);}…

AI Chat 设计模式:11. 状态模式

本文是该系列的第十一篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 你知道状态模式吗A.1Q.2 它与有限状态机有什么联系吗&#xff1f;A.2Q.3 知道了&…

Spring:IOC技术、Bean、DI

前言 Spring是一个开源的项目&#xff0c;并不是单单的一个技术&#xff0c;发展至今已形成一种开发生态圈。也就是说我们可以完全使用Spring技术完成整个项目的构建、设计与开发。Spring是一个基于IOC和AOP的架构多层j2ee系统的架构。 SpringFramework&#xff1a;Spring框架…

ROS2学习(四)进程,线程与节点的关系

节点与节点执行器 节点&#xff0c;英文是node,在ROS2中&#xff0c;节点是一个抽象的实体&#xff0c;它可以代表某种或某类特定功能的抽象集合体&#xff0c;它可以存在于进程中&#xff0c;也可以存在于线程中。所有ROS2的基础功能最基础的载体是节点&#xff0c;所有的通信…

mysql的InnoDB和myISAM引擎对比:插入数据

mysql主流引擎是InnoDB和myISAM。两者简单来说&#xff0c;InnoDB是行锁&#xff0c;支持事务&#xff1b;myISAM是表锁&#xff0c;不支持事务。具体理论上的区别&#xff0c;网上有很多说法&#xff0c;我这里不多说了。 这里做了一个试验&#xff0c;插入100w条数据&#x…

redis+token+分布式锁确保接口的幂等性

目录 1.幂等性是什么&#xff1f; 2.如何实现幂等性呢&#xff1f; 1.新增管理员&#xff0c;出弹窗的同时&#xff0c;请求后台。 2.后端根据雪花算法生成唯一标识key&#xff0c;以雪花数为key存到redis。并返回key给前端。 3.前端保存后端传过来的key。 4.前端输入完成…

使用事件侦听器和 MATLAB GUI 查看 Simulink 信号研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

异或运算详解

异或运算详解 定义特性用途总结 定义 参与运算的两个数据,按二进制位进行 ^ 运算,如果两个相对应为值相同结果为0,否则为1 1 ^ 0 1 0 ^ 1 1 0 ^ 0 0 1 ^ 1 0特性 异或^运算只能用于数值(整数) x ^ 0 x x ^ x 0用途 两个值交换,而不用使用临时变量 a a ^ b; b b ^…

2023年08月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2023年08月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

vue videojs视频播放插件 动态资源

概览&#xff1a;使用vediojs第三方视频播放插件&#xff0c;视频加载有两种方式&#xff0c;第一种是html方式&#xff0c;类似于img标签的src&#xff0c;写在video标签内的<source src>&#xff1b;第二种方式是js方式&#xff0c;实例化一个videojs对象并且赋值src。…

anaconda创建虚拟环境在D盘

【看一看就行&#xff0c;又是挺水的一期&#xff08;每一季都掺和一点子水分也挺好&#xff09;】 一、创建&#xff1a; conda create --prefixD:\python37\py37 python3.7 这下就在D盘了&#xff1a; 二、激活刚刚那个环境&#xff1a; activate D:\pyhton37\py37​ &…