时间:2023-10-31来源:系统城装机大师作者:佚名
使用delete删除数据表空间使用率并没有减少;
如果只保留少数数据可以使用这个方法:
先将要保留的数据insert到另外一张表中,然后执行sql:
1 | 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属性:
1 2 3 4 |
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,并且回收相应的索引。 |
由于我们删除了大量的数据 ,相应的索引也进行了删除,这时需要对索引进行收缩。
1 | 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表空间也会暴增。
2023-10-31
Oracle如何编写一个sqlldr实例2023-10-31
Oracle的SQLLDR用法简介2023-10-31
Oracle中的高效SQL编写PARALLEL解析1.Oracle数据库系统结构概述 2.Oracle数据库存储结构 物理存储结构 控制文件 数据文件 重做日志文件 归档日志文件 Oracle数据库逻辑结构 数据块(Data Block) (盘)区(Extent) 段(Segment) 表空间(Tablespace) 本地管...
2023-10-31
windows下的Oracle19c 一、官网下载Oracle19c数据库 二、安装Oracle数据库 1.解压安装包 2.运行setup.exe安装 三、配置 四、安装完Oracle数据库,给scott用户解锁 1.解决Oracle数据库中没有scott账户的问题 2.给scott...
2023-10-31