数据库delete不释放空间处理方法

本文探讨了因频繁增删操作导致数据库表出现大量碎片的问题及解决方案。介绍了MySQL、Greenplum (gp)、GBase和Oracle数据库中如何通过优化表、回收垃圾、压缩表空间等手段释放磁盘空间并提升查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近做项目遇到个问题,数据库实际有效数据才几万行,但是因为该表属于频繁变动的表,单节点实际已经超过30亿行,rowid一直在增加,直接导致表不可用。最后分析下来,是因为delete操作只是将数据标识位删除,并没有整理数据文件,因此在数据文件中留下了碎片,不释放其占用的空间。如果一张表,频繁被insert、delete,且删除的数据没有规律,那么数据就会出现大量的空洞,占用磁盘空间且影响查询性能。

经过网上搜索了解,目前delete删除数据库有两种情况:

1)当DELETE后面跟条件的时候,则就会出现删除数据后,数据表占用的空间大小不会变。

如:delete from table_name where 条件 

2)不跟条件直接delete的时候,清除了数据,同时数据表的空间也会变为0。

如:delete from table_name 

那么,针对这个问题,搜索整理了一些目前常见的数据库处理方法:

1)mysql:使用OPTIMIZE TABLE 指令对表进行优化。
命令语法:OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
最简单的:optimize table XXX;
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。
注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。因此,这个操作一定要在网站访问量较少的时间段进行。

在多数的设置中,根本不需要运行OPTIMIZE TABLE。即使对可变长度的行进行了大量的更新,也不需要经常运行,每周一次或每月一次只对特定的表运行即可。

2)、gp数据库:定期使用Vacuum analyze tablename 回收垃圾和收集统计信息。
该动作会消耗系统一定的资源,引起系统的IO上升,对有一定系统瓶颈来说容易造成堵塞,严重会把GP宕掉,造成数据库瞬断。vacuum只是简单的回收空间且令其可以再次使用,没有请求排它锁,仍旧可以对表读写。
但是在postgresql中VACUUM的效果并不明显,一般都可认为不回收空间,只有vacuum full才会。vacuum full执行更广泛的处理,包括跨块移动行,以便把表压缩至使用最少的磁盘块数目存储。相对vacuum要慢,而且会请求排它锁。
在日常维护中,需要对数据字典定期执行vacuum,可以每天在数据库空闲的时候进行。然后每隔一段较长时间(两三个月)对系统表执行一次vacuum full,这个操作需要停机,比较耗时,大表可能耗时几个小时。reindex:执行vacuum之后,最好对表上的索引进行重建。

3)、gbase数据库:使用alter table XXX shrink space释放空间。

4)、oracle数据库:

如:alter table XXX enable row movement;
      alter table XXX shrink space
注意:shrink table只会针对assm(自动段空间管理)的表有用,否则会报: ORA-10635: Invalid segment or tablespace type。
alter table XXX enable row movement语句会造成引用表tablename_max的对象(如存储过程、包、视图等)变为无效。执行完成后,最好执行一下utlrp.sql来编译无效的对象。



### 回答1: 当使用Oracle的DELETE语句删除中的数据时,空间中的空间会立即释放。这是因为Oracle使用了一种称为Undo机制的技术来保证数据的一致性和事务的原子性。当删除操作执行时,Oracle会将删除的数据存储在Undo空间中,以便在需要时可以恢复数据。因此,即使删除了数据,空间中的空间会立即释放。 要释放空间中的空间,可以使用Oracle的ALTER TABLESPACE语句来收缩空间。该语句将会将空间中的空闲空间收缩并返回给操作系统。收缩空间的语法如下: ALTER TABLESPACE tablespace_name SHRINK SPACE; 其中,tablespace_name是要收缩的空间的名称。执行该语句后,Oracle将会自动收缩空间释放空间。需要注意的是,收缩空间可能会导致数据库性能下降,因此应该谨慎使用。 ### 回答2: Oracle是一款常用的关系型数据库管理系统,它提供了删除数据的方法,即delete语句。当使用delete语句删除中的数据时,空间会自动释放,需要做一些操作才能释放空间。 一般情况下,当使用delete语句删除的数据时,数据库会自动收回这部分空间,而是将空间标记为可重用空间。这意味着,虽然数据被删除了,但是所占用的空间并没有减少,它仍然会占用磁盘的存储空间,导致无法充分利用磁盘资源。 为了释放所占用的空间,可以使用Oracle提供的命令vacuum。vacuum命令会为空间重新排序,合并相邻的块,从而释放所占用的空间。vacuum命令的语法如下: vacuum FULL table_name; 其中,table_name是要释放空间名。vacuum命令需要在关闭数据库的情况下才能执行,在执行该命令前需要提前备份数据。 除了使用vacuum命令,还可以使用Oracle提供的其他方法释放空间,例如重新创建、重建索引等。这些方法都需要谨慎使用,因为它们可能会影响到数据库的性能和数据的完整性。 总之,当使用delete语句删除数据时,空间会自动释放,需要使用vacuum命令或其他方法释放空间。在释放空间的过程中,需要注意对数据库的性能和数据的完整性进行保护。 ### 回答3: 当使用Oracle数据库中的DELETE语句删除中的行时,空间删除的行所占用的空间会被自动释放。这是因为Oracle的存储模型是一种延迟分配的方式,即仅当需要的时候才会分配足够的存储空间。 因此,一旦使用DELETE语句从删除行后,可以通过以下几种方式释放空间: 1. 使用TRUNCATE TABLE语句 TRUNCATE TABLE语句用于清空中的所有行。这个命令会立即释放空间。但需要注意的是,使用TRUNCATE TABLE操作后,将重置,且无法使用ROLLBACK进行回滚操作。 2. 使用ALTER TABLE语句 ALTER TABLE语句用于修改的结构。可以先将重命名为另外一个名称,然后再重新创建一个与原结构相同的,将数据插入到新中,这样就会释放所占用的空间。 3. 使用OPTIMIZE TABLE语句 OPTIMIZE TABLE语句也可以释放空间。该语句会重建并优化存储空间。这个命令会自动释放空间,并且还可以提高查询速度和优化性能。 4. 使用数据泵工具 可以使用Oracle提供的数据泵工具(Data Pump)导出和导入,这也是一种释放空间方法。使用此方法空间中所有的数据导出,然后导入到一个新的空间中,旧空间空间空间将被释放。 总的来说,针对空间释放的问题,可以根据自己的需要选择合适的方法。也需要注意,无论采用哪种方法释放空间,在执行前一定要备份数据库,以避免必要的损失。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值