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

环境:

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.mzph.cn/news/21893.shtml

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

相关文章

【SEO基础】百度权重是什么意思及网站关键词应该怎么选?

百度权重是什么意思及网站关键词应该怎么选&#xff1f; 正文共&#xff1a;3253字 20图 预计阅读时间&#xff1a;9分钟 ​ 1.什么是网站权重&#xff1f; 这段时间和一些朋友聊到网站权重以及关键词&#xff0c;发现蛮多人对于这两个概念的认知还是存在一些错误的&#xf…

数组的使用(逆序、冒泡)

内存连续数据类型相同从0开始索引 找出数组中的最大值 #include <iostream> #include <stdlib.h> //随机数所在文件 using namespace std;int main() {int arr[5]{104,134,145,129,89};//初始化没有填的为0 int max0;for(int i0;i<5;i){if(arr[i]>max){ma…

矩阵计算之求解

文章目录 已知 A*BC一、矩阵计算 -求A一、矩阵计算 -求B 已知 A*BC 一、矩阵计算 -求A AC*invB一、矩阵计算 -求B BinvA*C

203. 移除链表元素

203. 移除链表元素 题目方法1递归方法2迭代 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 方法1递归 class Solution { public:ListNode* removeElements(ListNode* head, in…

winform使用SetParent 嵌入excel,打开的excel跟随dpi 25%*125%缩放了两次,目前微软官方没有好的解决方案,为什么

双重缩放问题在将 Excel 嵌入到 WinForm 中时确实可能会出现&#xff0c;这是因为两个不同的应用程序&#xff08;WinForm 和 Excel&#xff09;之间的 DPI 缩放逻辑不一致&#xff0c;导致双重缩放的结果。 在 Windows 操作系统中&#xff0c;DPI 缩放是一种全局的设置&#…

RabbitMQ快速入门

文章目录 1、RabbitMQ的概述1.1、什么是消息队列&#xff1f;1.2、为什么要使用消息队列&#xff1f;1.3、RabbitMQ的特点&#xff1a; 2、RabbitMQ的安装2.1 下载与安装2.2 常用命令 3、RabbitMQ消息发送和接受3.1 消息发送和接受机制3.2 AMQP的消息路由3.3 Exchange(交换机)的…

Datax 数据同步-使用总结(一)

1&#xff0c;实时同步&#xff1f; datax 通常做离线数据同步使用。 目前能想到的方案 利用 linux 的定时任务时间戳的方式做增量同步。 2&#xff0c;同步速度快不快&#xff1f; 单表同步速度还是挺快的 但是如果遇到复杂的 sql 查询&#xff0c;其同步效率&#xff0c…

中国信通院发布《高质量数字化转型产品及服务全景图(2023)》

2023年7月27日&#xff0c;由中国信息通信研究院主办的2023数字生态发展大会暨中国信通院铸基计划年中会议在北京成功召开。 本次大会发布了中国信通院《高质量数字化转型产品及服务全景图&#xff08;2023&#xff09;》&#xff0c;中新赛克海睿思受邀出席本次大会并成功入选…

Golang中空结构体的使用

空结构体的使用 何为空结构体 在结构体中&#xff0c;可以包裹一系列与对象相关的属性&#xff0c;但若该对象没有属性呢&#xff1f;那它就是一个空结构体。   空结构体&#xff0c;和正常的结构体一样&#xff0c;可以接收方法函数。 eg&#xff1a; type Lamp struct{}f…

秋招算法备战第38天 | 动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

动态规划理论基础 什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就…

能源电力工程师专属Python学习资料

随着我国新型电力系统的建设&#xff0c;一方面电源侧各类新能源装机快速增长&#xff0c;对于新能源出力的功率预测需求日益增长&#xff1b;另一方面&#xff0c;我国电力市场经过 8 年建设&#xff0c;关于电力商品价格影响因素的研究亟待深入。超过 90% 的业务小伙伴都具备…

viewerjs 如何新增下载图片功能(npm包补丁)

文章目录 先实现正常的效果实现下载图片改变viewerjs的build函数源码改变之后&#xff0c;执行npm i 之后node_modules源码又变回了原样 1、viwerjs所有功能都很完善&#xff0c;但唯独缺少了图片的下载 2、需求&#xff1a;在用viwerjs旋转图片后&#xff0c;可以直接下载旋转…

Dockerfile构建Tomcat镜像

准备apache包和jdk并解压 [rootlocalhost tomcat]# ll 总用量 196728 -rw-r--r--. 1 root root 9690027 7月 17 2020 apache-tomcat-8.5.40.tar.gz -rw-r--r--. 1 root root 674 8月 2 20:19 Dockerfile -rw-r--r--. 1 root root 191753373 7月 17 2020 jdk-8u191-…

淘宝全店商品数据导出(实现全店商品数据备份与迁移及分析)

一、淘宝全店商品导出的意义 1、备份数据淘宝全店商品导出可以将所有商品的数据备份到本地&#xff0c;避免因淘宝平台故障或其他原因导致数据丢失。迁移数据如果商家需要更换电商平台或将店铺迁移到其他地方&#xff0c;淘宝全店商品导出可以方便地将所有商品数据迁移到新平台…

DAY3,C高级(shell中的变量、数组、算术运算、分支结构)

1.整理思维导图&#xff1b; 2.判断家目录下&#xff0c;普通文件的个数和目录文件的个数&#xff1b; 1 #!/bin/bash2 arr1(ls -la ~/ | cut -d r -f 1 | grep -w -)3 arr2(ls -la ~/ | cut -d r -f 1 | grep -w d)4 echo "普通文件个数&#xff1a;${#arr1[*]}"5 e…

android Android Studio Giraffe | 2022.3.1 版本Lombok不兼容 解决方案

android Android Studio Giraffe | 2022.3.1 版本Lombok不兼容 解决方案 1.查看当前的android studio 版本 Android Studio Giraffe | 2022.3.1 Build #AI-223.8836.35.2231.10406996, built on June 29, 2023 2.打开 idea 官网下载页面 idea下载历史版本 找到对应的版本编号…

435. 无重叠区间

435. 无重叠区间 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后&#xff0c;剩下的区间…

“深入剖析JVM:揭秘Java虚拟机的工作原理“

标题&#xff1a;深入剖析JVM&#xff1a;揭秘Java虚拟机的工作原理 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;包括JVM的架构、内存管理、垃圾回收、即时编译等关键技术。通过对JVM的剖析&#xff0c;我们可以更好地理解Ja…

docker-compose --version报错

在部署docker-compose后&#xff0c;查看版本时有如下报错: 解决方法: 解决方法&#xff1a; 直接在release中下载对应的linux发行版【docker-compose-linux-x86_64】 https://github.com/docker/compose/releases/tag/v2.18.1 下载完后将软件上传至 Linux的【/usr/local/bin】…

el-table点击表格某一行添加到URL参数,访问带参URL加载表格内容并滚动到选中行位置 [Vue3] [Element-plus 2.3]

写在最前 需求&#xff1a;有个表格列出了一些行数据&#xff0c;每个行数据点击后会加载出对应的详细数据&#xff0c;想要在点击了某一行后&#xff0c;能够将该点击反应到URL中&#xff0c;这样我复制这个URL发给其他人&#xff0c;他们打开时也能看到同样的行数据。 url会根…