Postgresql频繁delete表数据后,数据库表数据很少,但是查询速度超级慢

文章讨论了在Postgresql中频繁执行delete操作后,尽管表数据量小,查询速度却变慢的问题。原因是delete并未真正删除数据,而是标记为已删除,占用空间未释放。解决方案包括使用truncate物理清空表和VACUUM或VACUUMFULL命令来整理和回收空间。
摘要由CSDN通过智能技术生成

Postgresql频繁delete表数据后,数据库表数据很少,但是查询速度超级慢

1.问题描述

数据库的表里只有一千多条数据,系统中有两个定时任务,每隔1分钟会对表数据进行一次delete和insert,刚开始数据查询很快,但是在运行了一段时间后,这个表的查询速度就越来越慢,达到了十几秒。

2.问题原因

这个问题可能是delete导致的,delete删除数据的时候,并不是真的删除了数据库的数据,而是将数据标记为已删除的状态,当频繁删除数据后,就会导致被标记的数据越来越多,而这些数据并没有被清理,还占用这表空间,delete操作并不会把这些数据占用的表空间还给操作系统,就导致虽然我们看表里数据很少,但其实这个表还要成千上万条隐藏的被删除的数据。

当查询的时候,数据库不只会扫描我们看到的表的数据,这些隐藏的数据也会被同时扫描,就会导致速度莫名其妙变慢。

3.解决方法

  • 使用truncate清空表数据

    • truncate清空表数据,是物理清空,会将占用的表空间归还给操作系统,并且自增序列等也会被重置为0,这样就不存在隐藏数据问题了。

    • 使用方法

      truncate 表名;
      
  • 使用VACUUM命令整理表

    • 使用VACUUM命令后,如果删除的记录为表的末端,那么这些记录占用的空间会被物理释放掉,归还给操作系统。如果不是末端数据,该命令会将指定表或索引中被删除数据所占用的空间重置为可用状态,那么之后又新数据插入时,将优先使用该空间,直到所有被重用的空间用完时,再考虑使用新增的磁盘页面

    • 使用方法

      vacuum 表名;
      
  • 使用VACUUM FULL命令整理表

    • 使用VACUUM FULL命令后,不论被删除的数据是否处于数据表的末端,这些数据所占用的空间都将被物理的释放并归还于操作系统。之后再有新数据插入时,将分配新的磁盘页面以供使用。

    • 使用方法

      vacuum full 表名;
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的小幸运呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值