PG中的一例简单的update看表膨胀

news/2024/7/9 20:27:10 标签: PostgreSQL, postgresql, SAP, 表膨胀

PostgreSQL数据库的MVCC机制中,一个明显的特点是,在执行DELETE操作,它一般并不立即擦除要删的数据,通常只是做一个标记,留给VACUUM进程去做相应的清理,并且是有条件的清理。

而UPDATE操作,则更是一个DELETE操作和一个INSERT操作的组合。INSERT操作则通常会APPEND一条记录在后边。这样的结果是,通常情况下,这种INSERT, UPDATE操作应该是很快的。但如果用的不当,也有一些反例:

下面看一则很普通的示例:

create table t3 (id int);
insert into t3 values(1);
begin;
\set VERBOSE verbose
do language plpgsql $$  
declare  
  tcount int = 100000;
begin
  for i in 1..tcount loop  
    update t3 set id = id+1; 
  end loop;  
end;  
$$;
commit;

DO
Time: 120762.618 ms (02:00.763)
mydb=*# commit;

我们可以明显的看到,一条普通的记录,在更新100000次的操作下,居然花了整整两分钟。

我们用下边的SQL来看看该表的元组分布情况:(将其中的public.t3改为你想要的表名,就可以查目标表的相应情况)

WITH cteTableInfo AS 
(
    SELECT 
        COUNT(1) AS ct
        ,SUM(length(t::text)) AS TextLength  
        ,'public.t3'::regclass AS TableName  
    FROM public.t3 AS t  
)
,cteRowSize AS 
(
   SELECT ARRAY [pg_relation_size(TableName)
               , pg_relation_size(TableName, 'vm')
               , pg_relation_size(TableName, 'fsm')
               , pg_table_size(TableName)
               , pg_indexes_size(TableName)
               , pg_total_relation_size(TableName)
               , TextLength
             ] AS val
        , ARRAY ['Relation Size'
               , 'Visibility Map'
               , 'Free Space Map'
               , 'Table Included Toast Size'
               , 'Indexes Size'
               , 'Total Relation Size'
               , 'Live Row Byte Size'
             ] AS Name
   FROM cteTableInfo
)
SELECT 
    unnest(name) AS Description
    ,unnest(val) AS Bytes
    ,pg_size_pretty(unnest(val)) AS BytesP

http://www.niftyadmin.cn/n/5454938.html

相关文章

Jmeter 从登录接口提取cookie 并 跨线程组调用cookie (超详细)

文章目录 一、开始前的准备二、 业务场景介绍三、从登录接口提取cookies四、跨线程组调用cookies 一、开始前的准备 1、安装Jmeter,参考文章:JMeter 3.1 和JMeterPlugin的下载安装 2、设置配置文件使Cookie管理器保存cookie信息。 修改apache-jmeter-x…

一键换脸的facefusion

FaceFusion 一个开源换脸软件,提供UI界面,启动后可直接在浏览器上面上传图片进行换脸操作。 电脑环境win10,软件pycharm,需要提前安装好python环境,推荐使用Anaconda3。关注文章下方公共号发送 “ 软件安装包 ”可以获…

6_相机坐标系_相机4个坐标系详述

相机系列文章是用来记录使用opencv3来完成单目相机和6轴机械臂手眼标定。本人吃饭的主职是linux下6轴机械臂相关应用开发。但对于机械臂运动学、相机应用等都非常感兴趣,所以对一些线性代数基础薄弱又想深入了解机械臂内部运算的同志比较有体会。由于是探索性学习&a…

Linux系统中内核参数优化技术

一、引言 在Linux系统中,内核参数的优化是提升系统性能和稳定性的重要手段之一。通过合理调整内核参数,可以优化系统资源的利用、提高系统的响应速度和吞吐量,以满足不同应用场景的需求。本文将深入探讨Linux系统中内核参数优化技术&#xf…

记录 AI绘图 Stable Diffusion的本地安装使用,可搭建画图服务端

开头 最近刷短视频看到了很多关于AI绘图,Midjourney,gittimg.ai,Stable Diffusion等一些绘图AI工具,感受到了AI绘画的魅力。通过chatGPT生成关键词再加上绘图工具,真是完美,文末教大家如何用gpt提词 Midj…

京东自动抢茅台脚本

目前,在多家电商平台都可以抢购茅台酒,包括天猫超市、京东、天猫会员店、国美、苏宁、网易严选等渠道,消费者使用一台手机便可参与抢购,不过,很多消费者依旧不清楚用手机抢茅台怎么抢,因为抢购的人实在太多…

文件操作(基础知识篇)

1. 文件操作的作用 可以将内存中的数据持久化地存储到文件中。我们所运行的程序的数据是存储在电脑的内存中的,如果不将数据持久化地存储起来,那么在程序退出时,内存中的数据就会随内存的回收而消失。 可以持久化保存数据的,就被…

Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias

场景 Nginx搭建静态资源映射实现远程访问服务器上的图片资源: Nginx搭建静态资源映射实现远程访问服务器上的图片资源_nginx 当作图片资源访问 博客-CSDN博客 以上在配置静态资源映射时使用的如下配置 location / {root D:/pic_old/;try_files $uri $uri/ /ind…