Oracle 表数据段收缩示例

发布于:2024-06-05 ⋅ 阅读:(134) ⋅ 点赞:(0)

Oracle 表数据段收缩示例

创建测试表
conn ahern/ahern
create table tab_test(code varchar2(20));

插入10000条数据到表中
declare
  intsize number;
begin
  for i in 1 .. 10000 loop
    insert into tab_test (code) values ('abcd');
    commit;
  end loop;
end;
/

查看该表占用的段空间大小
SQL> col segment_name for a20
SQL> select segment_name,bytes from user_segments where segment_name='TAB_TEST';

SEGMENT_NAME              BYTES
-------------------- ----------
TAB_TEST                 196608

删除表中数据
SQL> delete from tab_test;

已删除 10000 行。

SQL> commit;

提交完成。

再次查看该表占用的段空间大小,发现删除数据后段空间并没有得到释放
SQL> select segment_name,bytes from user_segments where segment_name='TAB_TEST';

SEGMENT_NAME              BYTES
-------------------- ----------
TAB_TEST                 196608

开启表的行移动
SQL> alter table tab_test enable row movement;

表已更改。

收缩段空间
SQL> alter table tab_test shrink space;

表已更改。

再次查看该表占用的段空间大小,空间已经释放
SQL> select segment_name,bytes from user_segments where segment_name='TAB_TEST';

SEGMENT_NAME              BYTES
-------------------- ----------
TAB_TEST                  65536
注意:从user_segments里面查询到的是段空间已经被释放,但是从 user_tables 或者 dba_tables 数据字典查询你会发现这里记录并未及时更新,因为需要等到下次数据库自动维护统计信息后才会更新,手动收集统计信息或者做表分析也可以更新里面的记录。
alter table table_name shrink compact/space; compact 将块中的数据放在一起,但不释放空闲空间,高水位也不会下降,支持DML操作。space 释放空闲空间,高水位下降,会锁定表不支持其它DML操作,对数据库性能影响比较大。

 


网站公告

今日签到

点亮在社区的每一天
去签到