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

  

posted @   orcl  阅读(915)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示