oracle删除数据但表空间占用率没有减小的情况(oracle删除表空间和数据文件)没想到

随心笔谈2年前发布 admin
217 0 0

文章摘要

这篇文章介绍了在Oracle中删除大表数据后表空间占用率未减的处理方法。当使用`DELETE`命令删除数据但表空间占用率未减少时,通常需要考虑以下两种方法: 1. **将数据转移到其他表并清空原表** - 将需要保留的数据复制到新表中,然后清空原表,并将新表重命名为原表。具体步骤包括: - 创建新表:`CREATE TABLE tablename_min AS SELECT * FROM tablename_max a WHERE condition;` - 清空原表:`DROP TABLE tablename_max;` - 重命名新表:`ALTER TABLE tablename_min RENAME TO tablename_max;` 2. **使用Shrink Table压缩表空间** 当删除的数据量较小(例如3亿条数据删除1亿条)时,可以使用`Shrink Table`功能来优化空间管理: - 首先执行`DELETE`命令删除部分数据。 - 启用行迁移功能:`ALTER TABLE tablename_max ENABLE ROW MOVEMENT;` - 调整自动段空间管理(ASMS): - `ALTER TABLE ... SHRINK SPACE`:减少HWM(空闲数据块)、提高I/O效率。 - `ALTER TABLE ... SHRINK SPACE CASCADE`:同时回收索引。 需要注意以下事项: - Shrink Table功能仅适用于自动段空间管理的表,否则会报错。 - 使用Shrink Table可能会导致大量重做操作和存储过程无效,需执行`UTLRP.sql`脚本修复引用。 - 确保有足够的 archivelog 空间以处理大量重做操作。 这篇文章为解决大表空间占用率问题提供了实用参考,供读者参考。



目录oracle删除数据但表空间占用率没有减小oracle 大表删除数据后,回收空间的问题一般有一下几种方法总结

使用delete删除数据表空间使用率并没有减少;

如果只保留少数数据可以使用这个方法:

先将要保留的数据insert到另外一张表中,然后执行sql:

truncate table tablename DROP STORAGE;

解释: 直接删除表,并且释放存储空间。truncate的意思是清空表数据, “DROP STORAGE”是释放存储空间。

然后在将备份数据还原;

在oracle中由于表结构设计不合理或者需要清楚老数据的时候,经常需要对大表数据进行清理。

1.删除大部分数据,留下小部分数据。我们可以把需要保留的数据转移到别的表,然后再把大表drop掉,然后改名就行了;

a) create table tablename_min as select * from tablename_max a where 需要保留的数据.

b) drop table tablename_max ;

c) rename tablename_min as tablename_max ;

这样就能清除这个大表的hwm,而且释放掉其他空间。

2.当删除的数据只是一小部分数据的话,第一种方法就不适用了。比如 3亿条数据,你删除一亿条数据的话,用1就不合适。

这时我们就应该考虑使用shrink table的方式。

a) 我们可以先用delete from tablename_max;

b) 由于我们进行了数据的delete 所以造成了 tablename_max 这张表的数据稀疏,数据块并没有减少,hwm也没有减少,这样就会影响全表扫描需要访问更多的数据块。这时我们可以通过shrink来重组数据使数据分布更紧密,同时降低HWM释放空闲数据块。

c)由于需要移动行数据,数据的rowid会发生变化,所以需要设置表的row movement属性:

alter table tablename_max enable row movement; –开启行迁移功能。
alter table tablename_max shrink space compact;–(可以在压缩期间进行DML操作和查询) ,收缩表,不会降低hwm
alter table tablename_max shrink space; –( 调整HWM时将阻塞DML操作),收缩表,并且降低hwm
alter table tablename_max shrink space cascade;–收缩表并降低hwm,并且回收相应的索引。

由于我们删除了大量的数据 ,相应的索引也进行了删除,这时需要对索引进行收缩。

alter index idxname shrink space;

注意:shrink table只会针对assm(自动段空间管理)的表有用,否则会报: ORA-10635: Invalid segment or tablespace type。

alter table tablename_max enable row movement语句会造成引用表tablename_max的对象(如存储过程、包、视图等)变为无效。执行完成后,最好执行一下utlrp.sql来编译无效的对象。

由于是通过DML操作进行的,会产生大量redo,注意archivelog目录的空间大小问题;同时undo表空间也会暴增。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:Oracle中查看表空间使用率的SQL脚本分享Oracle表空间不足的两种解决办法Oracle数据库中表空间的基本管理操作小结

© 版权声明

相关文章