为什么delete后磁盘空间没有释放而truncate会释放?

背景

因项目需求,需要清理一批旧数据,腾出空间给新数据,让同事负责这件事。料想会很顺利,但很快找到我,并告知在postgresql中把一张大的数据表删除掉了,查询表的size并没有改变。

我震惊了,问他怎么删除数据表的数据的,他告诉我使用”DELETE FROM table”,然后使用下面的语句进行查询

--数据库中单个表的大小(不包含索引)
select pg_size_pretty(pg_relation_size('表名'));
--查出所有表(包含索引)并排序
SELECT table_schema || '.' || table_name AS table_full_name, pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC limit 20

我让他用truncate试试,他兴冲冲的跑去执行了,然后告诉我这个方法是可行的。

解决方式

这件事情结束后,总觉得不踏实。不搞清楚,睡觉不踏实,那就继续深挖挖。

delete应该没有被真正删除或者事务没有完成,空间没有释放,重新测试了一遍,发现等了半个小时,空间也没有释放,应该不是事务的问题,就是没有真正删除,而仅仅标识为已删除状态。

想要释放空间,怎么办呢?

postgresql提供了一个VACUUM命令,详见https://www.postgresql.org/docs/devel/sql-vacuum.html

总结

  1. truncate的删除效率远远高于delete from table
  2. Delete 是 DML, Truncate是DDL
  3. Delete 不释放空间, Truncate释放空间
  4. Delete 可以删除表的部分记录, Truncate删除整个表的记录
  5. Delete产生小量的redo日志和大量的undo日志. Truncate产生的redo和undo微乎其微。

参考资料

【1】https://stackoverflow.com/questions/139630/whats-the-difference-between-truncate-and-delete-in-sql

Original: https://www.cnblogs.com/davidwang456/p/11790597.html
Author: 一天不进步,就是退步
Title: 为什么delete后磁盘空间没有释放而truncate会释放?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/547101/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • T480拆机加内存,换高清屏幕—全攻略

    Thinkpad T480乞丐版,先吐槽:我买电脑用于商务,不打游戏,平时做做PPT,WORD,偶尔看看电影,所以需求不高。原来对T系列印象是为工程机,为经典和均衡,结实稳定,E系…

    技术杂谈 2023年5月31日
    0114
  • docker学习:docker安装

    Centos7 安装docker 下载安装yum install docker-ce 启动dockersystemctl start docker 创建并编写镜像加速文件vim /…

    技术杂谈 2023年7月10日
    069
  • 安装Harbor之http版本

    一、安装Harbor Harbor简介 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展…

    技术杂谈 2023年5月31日
    082
  • 基于zookeeper集群的云平台-配置中心的功能设计

    最近准备找工作面试,就研究了下基于zookeeper集群的配置中心。 下面是自己设想的关于开源的基于zookeeper集群的云平台-配置中心的功能设计。大家觉得哪里有问题,请提出宝…

    技术杂谈 2023年7月11日
    073
  • CSRF攻击与防御(写得非常好)

    转: 防御方法参考: posted @2022-07-06 14:46 戈博折刀 阅读(16 ) 评论() 编辑 Original: https://www.cnblogs.com…

    技术杂谈 2023年5月31日
    0106
  • 面试被问怎么排查平时遇到的系统CPU飙高和频繁GC,该怎么回答?

    对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。这种情况可能的原因主要有两种…

    技术杂谈 2023年5月31日
    075
  • eslint 报错-Missing space before value for key ‘xxx’

    es-lint报错 原因:对象值前没有加空格 解决: 本文来自博客园,作者:King-DA,转载请注明原文链接:https://www.cnblogs.com/qingmuchua…

    技术杂谈 2023年6月1日
    083
  • Jenkins持续集成入门到精通(入门篇)

    什么是持续集成 持续集成(Continuous integration,简称CI)指的是频繁将代码集成到主干。它的目的,就是让产品可以快速迭代,同时保持高质量。核心措施,代码集成到…

    技术杂谈 2023年7月24日
    081
  • 查找文本文件中重复的汉字

    查找文本文件中重复的汉字,找到在所在行号 文本文件格式 大 小 多 少 前 后 左 …… text.py import os import re list = [] sam…

    技术杂谈 2023年5月31日
    0134
  • 防火墙NAT配置与DHCP下发

    该实验如果有做的不足的地方请见谅 实验目标: 按要求划分区域,公司内部办公区为trust,服务器区为dmz,外部网络为untrust。 PC1和PC2为公司内部办公区,需要从防火墙…

    技术杂谈 2023年6月21日
    079
  • Golang异常处理

    从error的定义说起 type error interface { Error() string } Go 的error类型是一个接口。在Go中,只要实现了接口约定的方法,就等同…

    技术杂谈 2023年7月11日
    064
  • Linux 快速查找并结束僵尸进程

    Linux SSH 连接后显示: There is 1 zombie process. 说明当前正在运行的系统当中存在1个僵尸进程正在无意义消耗资源。 ==============…

    技术杂谈 2023年6月21日
    086
  • 用两个栈实现一个队列

    把栈封装成队列 对于栈,就采用c++里面的stack使用两个栈,栈是先进后出,而队列是先进先出现在有两个栈,一个栈A放数据,另一个栈B为空,只要把前面栈A的数据出栈然后压到栈B,然…

    技术杂谈 2023年6月21日
    082
  • 跨站脚本攻击XSS:为什么cookie中有httpOnly属性

    通过上篇文章的介绍,我们知道了同源策略可以隔离各个站点之间的 DOM 交互、页面数据和网络通信,虽然严格的同源策略会带来更多的安全,但是也束缚了 Web。这就需要在安全和自由之间找…

    技术杂谈 2023年5月31日
    0120
  • Centos6.x完全禁用IPv6的方法

    一、centos6.x完全禁用IPv6的方法 2.修改/etc/hosts,把ipv6的那句本地主机名解析的也注释掉: ::1 localhost localhost6 local…

    技术杂谈 2023年5月31日
    0107
  • RabbMQ

    RabbitMQ基本概念 Broker: 简单来说就是消息队列服务器实体 Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列 Queue: 消息队列载体,每个消息…

    技术杂谈 2023年7月24日
    061
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球