Oracle 表数据段收缩示例

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操作,对数据库性能影响比较大。

 

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ahern_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值