千家信息网

oracle 表收缩

发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,当使用delete表数据后,空间无法释放,可以使用表收缩释放表空间;注意:当delete表大量数据的时候要注意undo,可以使用:alter table emp nologging; 让其不生产日志一
千家信息网最后更新 2024年11月25日oracle 表收缩

当使用delete表数据后,空间无法释放,可以使用表收缩释放表空间;

注意:当delete表大量数据的时候要注意undo,可以使用:alter table emp nologging; 让其不生产日志


一、表的增长方式

当表被创建后,随着记录的不断插入,组成表的区间会被填满,如果启用了自动扩展,则当区间填满后,会分配新的区间。假定高水

位线随着记录的增加从最左端往右端来移动,当到底部区间的尾端时,则新的区间将会被分配。

二、表可收缩的原理

随着记录的增加高水位线不断的右移,记录的删除不会导致高水位线往回(左)移动

删除记录后的空闲空间(高水位线左侧)尽管可以使用,但其稀疏性导致空间空闲

注:完整的表扫描所耗费的时间不会因为记录的减少(删除)而减少


三、使用 alter table tbname shrink space 来收缩表段

1. 实现原理

实质上构造一个新表(在内部表现为一系列的DML操作,即将副本插入新位置,删除原来位置的记录)

靠近末尾处(右端)数据块中的记录往开始处(左端)的空闲空间处移动(DML操作),不会引起DML触发器

当所有可能的移动被完成,高水位线将会往左端移动(DDL操作)

新的高水位线右边的空闲空间被释放(DDL操作)

2. 实现前提条件

必须启用行记录转移(enable row movement)

仅仅适用于堆表,且位于自动段空间管理的表空间(堆表包括:标准表,分区表,物化视图容器,物化视图日志表)

3. 不能实现收缩的表

群集表

具有LONG类型列的表

LOB段(尽管表本身可以被缩小),注,10gR2以后版本支持对LOB段的收缩

具有基于提交的物化视图的表(因为禁用了触发器)

具有rowid物化视图的表(因为rowid发生了变化)

IOT映射表IOT溢出段

索引基于函数的表

未启用行记录转移的堆表

4. 段收缩的优点

提高缓存利用率,提高OLTP的性能

减少磁盘I/O,提高访问速度,节省磁盘空间

段收缩是在线的,索引在段收缩期间维护,不要求额外的磁盘空间

5. 两个选项

cascade: 缩小表及其索引,并移动高水位线,释放空间

compact: 仅仅是缩小表和索引,并不移动高水位线,不释放空间

alter table tbname shrink space 相当于带cascade参数

实战练习:

1、首先删除表里的数据

SQL> alter table FEE_COLLECT_TMP nologging; ----设置表不产生undo

SQL> delete from FEE_COLLECT_TMP where CUTOFFDAY='20170501';

SQL> commit;

2、收缩表

SQL> alter table FEE_COLLECT_TMP enable row movement; -->开启row movement


SQL> alter table FEE_COLLECT_TMP shrink space; -->shrink成功


3、语法总结:

ALTER TABLE  ENABLE ROW MOVEMENT   -->前提条件                                                                                                                                          ALTER TABLE  SHRINK SPACE [  | COMPACT | CASCADE ];                                                                                                                                 ALTER TABLE  SHRINK SPACE COMPCAT;  -->缩小表和索引,不移动高水位线,不释放空间                                                                                                           ALTER TABLE  SHRINK SPACE;     -->收缩表,降低高水位线;                                                                                                                                   ALTER TABLE  SHRINK SPACE CASCADE; -->收缩表,降低高水位线,并且相关索引也要收缩一下                                                                                                      ALTER TABLE  MODIFY LOB (lob_column) (SHRINK SPACE);  -->收缩LOB段                                                                                                                        ALTER INDEX IDXNAME SHRINK SPACE;     -->索引段的收缩,同表段


#################################################################


1、收缩普通表,批量脚本

select'alter table '||table_name||' enable row movement;'||chr(10)||'alter table '||table_name||' shrink space;'||chr(10)from user_tables;

select'alter index '||index_name||' shrink space;'||chr(10)from user_indexes;

0