暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

删除与空间回收

原创 王跃辉 2022-10-18
742

删除对比

1、从删除内容来分:

truncate 和 delete 只是删除数据

drop 删除表结构、constrain,trigger , index ,依赖于该表的函数和存储过程


2、语句类型:

delete 是DML操作,会放在回滚段里,事务提交后生效,

truncate 和 drop 是DDL语句,操作立即生效,不能回滚,不触发 trigger


3、对表空间的影响

delete 语句不影响表所占用的 extent,高水位线保持位置不动

drop 释放表所占用的表空间

truncate 将空间释放到 minextents 个 extent ,除非使用 reuse storage ,还会复位高水位线


4、删除速度

dorp 大于 truncate 大于 delete

在线段收缩(Online Segment Shrink)

指在线整理段空间里的碎片,它有以下几个特点:

  • 在线,即在段压缩过程中,DML几乎不受影响(只有在结束前很短的时间内,DML会被阻塞)
  • in-place的操作,不需要额外的空间
  • 收缩完成后索引依然可用

它不但能够收回高水位线以上未使用的空间,还可以收回高水位线下未使用的空间,它的主要步骤是:

  1. 压缩段空间
  2. 调整高水位线
  3. 释放收回的空间

使用Shrink有两个前提条件:

  1. 表必须启用row movement
  2. 表段所在表空间的段空间管理(segment space management)必须为auto

查询表空间的区管理方式、段管理方式:

select tablespace_name,extent_management,segment_space_management

from dba_tablespaces;


进行Shrink操作

语法如下:

alter table/index/materialized view object_name shrink space [cascade] [compact];

cascade:是指压缩所有依赖的对象,比如压缩表语句加上cascade,表上所有的索引都会被压缩

compact:把压缩过程分为两个阶段:第一个阶段的语句带compact,压缩段空间,

在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。由于涉及到rowid的改变,

需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。

第二个阶段语句不带compact,调整高水位并释放收回的空间。此过程需要在表上加X锁,

会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。

对于大表,建议采用compact选项。

实验:

SQL>create table t as select * from dba_objects;

SQL> create index i on t(object_id);

查看表和索引空间使用情况:

SQL>select segment_name,segment_type,bytes,blocks from dba_segment

where owner ='test' and segment_name in

(selelct 'T' from dual UNION ALL select index_name from dba_indexes

where table_owner='test' and table_name='T');

删除表和索引:DELETE from t;

commit;

再次查看表和索引空间的使用情况,发现空间并没有被回收

进行 回收操作:

开启行移动:alter table t enable row movement;

查看是否开启:selelct row_movement from user_tables where table_name='t';

进行回收: alter table t shrink space cascade compact;

alter table t shrink space cascade;

再次查看表和空间的使用情况,发现空间已经释放:


在 Oracle数据库中,对表进行大量 delete 操作,高水位线不会自动回收,

那就需要对表进行 shrink , 以提高查询效率,同时考虑对数据文件进行resize

shrink 回收分两个阶段:

1、数据重组 compact

通过一系列 insert 和 delete 操作,将数据尽量排在段前面。这个过程需要在表上

加 RX锁,即在需要移动的行上加锁,由于涉及到 rowid 改变,需要激活 行移动

同时要禁用 基于 rowid 的触发器,这个过程对业务影响较小


2、高水位线 HWM的调整:第二个阶段是调整 HWM的位置,释放空闲数据块

此过程要在表上加 X 锁,会造成表上所有的 DML语句阻塞,

在业务特别繁忙的系统上会造成较大的影响


shrink 必须开启行移动功能:

alter table table_name enable row movement;

数据重组:

alter table table_name shrink space compact;

回收:

alter table table_name shrink space cascade;

(加cascade,表上相应的索引也会同时进行收缩 )


3、 收缩会产生大量的归档日志,要保证有足够的归档空间


4、对表进行shrink 后,可以考虑对数据文件进行 resize;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论