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

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

相关推荐
华仔啊16 小时前
千万别给数据库字段加默认值 null!真的会出问题
java·数据库·后端
爱吃橘子橙子柚子1 天前
3CPU性能排查总结(超详细)【Linux性能优化】
运维·cpu
随风飘的云2 天前
MySQL的慢查询优化解决思路
数据库
IvorySQL2 天前
PostgreSQL 技术日报 (3月7日)|生态更新与内核性能讨论
数据库·postgresql·开源
赵渝强老师2 天前
【赵渝强老师】金仓数据库的数据文件
数据库·国产数据库·kingbase·金仓数据库
随逸1772 天前
《Milvus向量数据库从入门到实战,手把手搭建语义检索系统》
数据库
神秘的猪头2 天前
🚀 React 开发者进阶:RAG 核心——手把手带你玩转 Milvus 向量数据库
数据库·后端·llm
舒一笑3 天前
程序员效率神器:一文掌握 tmux(服务器开发必备工具)
运维·后端·程序员
IvorySQL3 天前
PostgreSQL 技术日报 (3月6日)|为什么 Ctrl-C 在 psql 里让人不安?
数据库·postgresql·开源
NineData3 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库