Oracle 收缩表高水位线

Oracle 收缩表高水位线节省空间

1、模拟在一张表中插入数据并收集统计信息

SQL> create table ahern.test as select * from dba_objects;

表已创建。

SQL> insert into ahern.test select * from ahern.test;

已创建 72974 行。

SQL> insert into ahern.test select * from ahern.test;

已创建 145948 行。

SQL> insert into ahern.test select * from ahern.test;

已创建 291896 行。

SQL> commit;

提交完成。

SQL> exec dbms_stats.gather_table_stats(ownname => 'AHERN',tabname => 'TEST',DEGREE => 2);

PL/SQL 过程已成功完成。

查询空间情况,可以看到初始表的碎片为 75254.44。

SQL> SELECT table_name,

2 ROUND((blocks * 8), 2) "HW_space",

3 ROUND((num_rows * avg_row_len / 1024), 2) "real_space",

4 ROUND((blocks * 10 / 100) * 8, 2) "pctfree",

5 ROUND((blocks * 8 - (num_rows * avg_row_len / 1024) -

6 blocks * 8 * 10 / 100),

7 2) "waste_space"

8 FROM dba_tables

9 WHERE temporary = 'N'

10 AND TABLE_NAME = 'TEST'

11 and OWNER = 'AHERN';

TABLE_NAME HW_space real_space pctfree waste_space


TEST 97352 75254.44 9735.2 12362.36

2、第一次删除数据

SQL> delete from ahern.test where object_type in ('SYNONYM', 'JAVA CLASS');

已删除 391224 行。

SQL> commit;

提交完成。

SQL> exec dbms_stats.gather_table_stats(ownname => 'AHERN',tabname => 'TEST',DEGREE => 2);

PL/SQL 过程已成功完成。

注:第一次删除了部分数据后查询空间水位线情况,可以看到表的碎片为 23318.78。

SQL> SELECT table_name,

2 ROUND((blocks * 8), 2) "HW_space",

3 ROUND((num_rows * avg_row_len / 1024), 2) "real_space",

4 ROUND((blocks * 10 / 100) * 8, 2) "pctfree",

5 ROUND((blocks * 8 - (num_rows * avg_row_len / 1024) -

6 blocks * 8 * 10 / 100),

7 2) "waste_space"

8 FROM dba_tables

9 WHERE temporary = 'N'

10 AND TABLE_NAME = 'TEST'

11 and OWNER = 'AHERN';

TABLE_NAME HW_space real_space pctfree waste_space


TEST 97352 23318.78 9735.2 64298.02

3、第二次删除数据

SQL> delete from ahern.test where object_type in('VIEW','INDEX','TABLE','TYPE');

已删除 123824 行。

SQL> commit;

提交完成。

SQL> exec dbms_stats.gather_table_stats(ownname => 'AHERN',tabname => 'TEST',DEGREE => 2);

PL/SQL 过程已成功完成。

注:第二次删除大量数据后查询表的碎片为 8525.87,从这里对比第一次删除数据后的空间使用情况可以看到浪费的空间一直在增加,从第一次删除数据到第二次删除数据,浪费的空间增加倒到了 79090.93,并且高水位线一直没有变化为 97352。

SQL> SELECT table_name,

2 ROUND((blocks * 8), 2) "HW_space",

3 ROUND((num_rows * avg_row_len / 1024), 2) "real_space",

4 ROUND((blocks * 10 / 100) * 8, 2) "pctfree",

5 ROUND((blocks * 8 - (num_rows * avg_row_len / 1024) -

6 blocks * 8 * 10 / 100),

7 2) "waste_space"

8 FROM dba_tables

9 WHERE temporary = 'N'

10 AND TABLE_NAME = 'TEST'

11 and OWNER = 'AHERN';

TABLE_NAME HW_space real_space pctfree waste_space


TEST 97352 8525.87 9735.2 79090.93

4、模拟整理碎片节省空间

开始收缩水位线整理碎片:

SQL> alter table ahern.test enable row movement;

表已更改。

SQL> alter table ahern.test shrink space;

表已更改。

SQL> exec dbms_stats.gather_table_stats(ownname => 'AHERN',tabname => 'TEST',DEGREE => 2);

PL/SQL 过程已成功完成。

注:通过上述收缩进行表碎片整理后,我们可以看到表的高水位已经降下来为 10120,并且浪费的空间也已经被释放,释放前 79090.93 ,释放后占用仅为 582.13。

SQL> SELECT table_name,

2 ROUND((blocks * 8), 2) "HW_space",

3 ROUND((num_rows * avg_row_len / 1024), 2) "real_space",

4 ROUND((blocks * 10 / 100) * 8, 2) "pctfree",

5 ROUND((blocks * 8 - (num_rows * avg_row_len / 1024) -

6 blocks * 8 * 10 / 100),

7 2) "waste_space"

8 FROM dba_tables

9 WHERE temporary = 'N'

10 AND TABLE_NAME = 'TEST'

11 and OWNER = 'AHERN';

TABLE_NAME HW_space real_space pctfree waste_space


TEST 10120 8525.87 1012 582.13

到此,表碎片整理结束。
注意:如需在生产环境中做表碎片整理,建议在业务空闲期间进行,避免影响业务。

相关推荐
不像程序员的程序媛3 小时前
系统cpu内存负载资源分析
运维·服务器·数据库
Jane Chiu4 小时前
Oracle DBMS_REDEFINITION(在线重定义)
数据库·oracle·分区表
全栈前端老曹4 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
怕孤单的草丛4 小时前
缓存管理面临的主要问题
java·数据库·缓存
我会尽全力 乐观而坚强5 小时前
MySQL零基础入门(二)
数据库·mysql·adb
Asuicao6 小时前
centos7.9版本升级ssh OpenSSH 9.8p1 源码 OpenSSL 1.1.1w 源码包以及安装升级回滚文档
运维·ssh
kali-Myon6 小时前
某校园门禁系统高危 SQL 注入漏洞挖掘复盘
数据库·sql·安全·web安全
志栋智能6 小时前
超自动化安全中的威胁狩猎
运维·安全·自动化
↘"LYong7 小时前
旧版 CentOS 安装 Docker 完整指南(附国内镜像加速)
linux·运维·docker