segment shrink分为两个阶段:
1)、数据重组(compact):通过一系列insert、delete操作,将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger,这一过程对业务影响比较小。
2)、HWM调整:第二阶段是调整HWM位置,释放空闲数据块。此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。
shrink space 语句两个阶段都执行。
shrink space compact 只执行第一个阶段。
如果系统业务比较繁忙,可以先执行shrink space compact重组数据,然后在业务不忙的时候再执行shrink space降低HWM释放空闲数据块。
shrink必须开启行迁移功能。
alter table table_name enable row movement;
模拟收缩表:
1.查询当前t1表水位线
SQL> select TABLE_NAME,TABLESPACE_NAME,NUM_ROWS,BLOCKS from user_tables where table_name='T1';
TABLE_NAME TABLESPACE_NAME NUM_ROWS BLOCKS
------------------------------ ------------------------------ ---------- ----------
T1 TEST 0 1
2.t1表插入100万行模拟数据
SQL> begin
for i in 1 .. 1000000
loop
insert into t1 values(i,'yy');
end loop;
commit;
end;
/ 2 3 4 5 6 7 8
PL/SQL procedure successfully completed.
3.收集t1表统计信息,并查询t1表水位线
SQL> exec DBMS_STATS.GATHER_TABLE_STATS('TEST', 'T1', method_opt => 'for all indexed columns',cascade=>TRUE);
PL/SQL procedure successfully completed.
SQL> select num_rows,blocks from user_tables where table_name='T1';
NUM_ROWS BLOCKS
---------- ----------
1000000 1882
4.删除80万行数据,并重新收集统计信息
SQL> delete from t1 where id<=800000;
800000 rows deleted.
SQL> exec DBMS_STATS.GATHER_TABLE_STATS('TEST', 'T1', method_opt => 'for all indexed columns',cascade=>TRUE);
PL/SQL procedure successfully completed.
5.查询删除数据后t1表水位线
SQL> select num_rows,blocks from user_tables where table_name='T1';
NUM_ROWS BLOCKS
---------- ----------
200000 1882
由此可见删除数据后,t1表水位线是不会自动下降的
6.开启t1表行移动,并且开始收缩表
SQL> alter table t1 enable row movement;
Table altered.
SQL> alter table t1 shrink space compact;
Table altered.
SQL> alter table t1 shrink space cascade;
Table altered.
SQL> select num_rows,blocks from user_tables where table_name='T1';
NUM_ROWS BLOCKS
---------- ----------
200000 1882
7.收缩表后再次收集t1统计信息
SQL> exec DBMS_STATS.GATHER_TABLE_STATS('TEST', 'T1', method_opt => 'for all indexed columns',cascade=>TRUE);
PL/SQL procedure successfully completed.
SQL> select num_rows,blocks from user_tables where table_name='T1';
NUM_ROWS BLOCKS
---------- ----------
200000 358
由以上查询结果可见,收缩表后,t1表水位线下降。
参考链接:
https://www.modb.pro/db/41839
https://www.modb.pro/db/13837
原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/277751.html