ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

oracle shrink space收缩表

2022-07-29 12:34:16  阅读:184  来源: 互联网

标签:space t1 ---------- SQL oracle table T1 shrink


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

  

标签:space,t1,----------,SQL,oracle,table,T1,shrink
来源: https://www.cnblogs.com/orcl-2018/p/16531842.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有