删除对比
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的操作,不需要额外的空间
- 收缩完成后索引依然可用
它不但能够收回高水位线以上未使用的空间,还可以收回高水位线下未使用的空间,它的主要步骤是:
- 压缩段空间
- 调整高水位线
- 释放收回的空间
使用Shrink有两个前提条件:
- 表必须启用row movement
- 表段所在表空间的段空间管理(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;




