oracle shrink space收缩表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | 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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)