oracle表碎片查询整理过程

 更新时间:2026年01月06日 14:32:12   作者:MrZhou周  
本文通过模拟插入、清理、删除数据,以及表碎片整理,详细记录了表的碎片率和浪费空间的变化,最终通过表碎片整理释放了浪费的空间并降低了高水位,为数据库管理提供了参考

oracle表碎片查询整理

模拟插入数据

create table test as select * from dba_objects;
insert into test select * from test;
insert into test select * from test;
insert into test select * from test;
commit;

收集统计信息

SET TIME ON
exec dbms_stats.gather_table_stats(ownname=>'TEST',tabname=> 'TEST',DEGREE=>2);

查询初始表的碎片率68126

SELECT table_name,
ROUND ( (blocks * 8), 2) "HW_space k",
ROUND ( (num_rows * avg_row_len / 1024), 2) "real_space k",
ROUND ( (blocks * 10 / 100) * 8, 2) "(pctfree) k",
ROUND (
( blocks * 8
- (num_rows * avg_row_len / 1024)
- blocks * 8 * 10 / 100),
2)
"waste_space k"
FROM user_tables
WHERE temporary = 'N' AND TABLE_NAME='TEST'
--and OWNER='TEST'
ORDER BY 5 DESC;

TABLE_NAME HW_space k real_space k (pctfree) k waste_space k
---------- ---------- ------------ ----------- -------------
TEST            89176     68126.08      8917.6      12132.32

第一次模拟清理数据

delete from test where object_type in('SYNONYM','JAVA CLASS');
commit;

再次收集统计信息

SET TIME ON
exec dbms_stats.gather_table_stats(ownname=>'TEST',tabname=> 'TEST',DEGREE=>2);

第一次清理完查询表的碎片率18963

TABLE_NAME HW_space k real_space k (pctfree) k waste_space k
---------- ---------- ------------ ----------- -------------
TEST            89176     18963.03      8917.6      61295.37

第二次模拟删除数据

delete from test where object_type in('VIEW','INDEX','TABLE','TYPE');
commit;

再次收集统计信息

SET TIME ON
exec dbms_stats.gather_table_stats(ownname=>'TEST',tabname=> 'TEST',DEGREE=>2);

第二次清理完查询表的碎片率6199

但是可以看到浪费的空间一直在增加74058.9,高水位一直没有变化89176

TABLE_NAME HW_space k real_space k (pctfree) k waste_space k
---------- ---------- ------------ ----------- -------------
TEST            89176       6199.5      8917.6       74058.9

进行表碎片整理

15:21:46 SQL> alter table test enable row movement;

Table altered.

15:24:52 SQL> alter table test shrink space;

Table altered.

15:25:23 SQL> exec dbms_stats.gather_table_stats(ownname=>'TEST',tabname=> 'TEST',DEGREE=>2);

PL/SQL procedure successfully completed.

15:25:47 SQL> SELECT table_name,
15:25:56   2  ROUND ( (blocks * 8), 2) "HW_space k",
15:25:56   3  ROUND ( (num_rows * avg_row_len / 1024), 2) "real_space k",
15:25:56   4  ROUND ( (blocks * 10 / 100) * 8, 2) "(pctfree) k",
15:25:56   5  ROUND (
15:25:56   6  ( blocks * 8
15:25:56   7  - (num_rows * avg_row_len / 1024)
15:25:56   8  - blocks * 8 * 10 / 100),
2)
15:25:56   9  15:25:56  10  "waste_space k"
FROM user_tables
15:25:56  11  15:25:56  12  WHERE temporary = 'N' AND TABLE_NAME='TEST'
15:25:56  13  --and OWNER='TEST'
15:25:56  14  ORDER BY 5 DESC;

TABLE_NAME HW_space k real_space k (pctfree) k waste_space k
---------- ---------- ------------ ----------- -------------
TEST             7408       6199.5       740.8         467.7

经过以上表碎片整理之后,可以看到表的高水位已经降下来7408,浪费的空间已经得到释放467.7

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Oracle随机函数之dbms_random使用详解

    Oracle随机函数之dbms_random使用详解

    dbms_random是oracle提供的一个随机函数包,本文将详细介绍函数的使用,需要的朋友可以参考下
    2012-12-12
  • Oracle 配置远程访问教程

    Oracle 配置远程访问教程

    这篇文章主要介绍了Oracle 配置远程访问教程,非常不错,具有参考借鉴价值,需要的朋友参考下吧,需要的朋友可以参考下
    2018-05-05
  • Oracle数据库的备份与恢复

    Oracle数据库的备份与恢复

    Oracle数据库的备份与恢复...
    2007-03-03
  • oracle 数据库隔离级别学习

    oracle 数据库隔离级别学习

    这篇文章主要介绍了oracle数据库的隔离级别相关的知识,数据库操作的隔离级别,有需要的朋友可以参考下
    2014-05-05
  • Oracle截取JSON字符串内容的方法

    Oracle截取JSON字符串内容的方法

    这篇文章主要介绍了Oracle截取JSON字符串内容 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Linux下的Oracle启动脚本及其开机自启动

    Linux下的Oracle启动脚本及其开机自启动

    这篇文章主要介绍了Linux下的Oracle启动脚本及其开机自启动的方法,大家可以参考使用
    2013-11-11
  • pl/sql导入、导出csv等格式文件详细步骤

    pl/sql导入、导出csv等格式文件详细步骤

    在 PL/SQL 开发中数据的导入和导出是常见的操作,下面这篇文章主要给大家介绍了关于pl/sql导入、导出csv等格式文件的详细步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • Oracle日志表的使用方式

    Oracle日志表的使用方式

    这篇文章主要介绍了Oracle日志表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Oracle归档日志爆满问题的处理方法

    Oracle归档日志爆满问题的处理方法

    Oracle归档日志(Archivelog)是Oracle数据库的一种特性,它主要用于数据恢复和高可用性的目的,但有什么经常会出现无法连接,手动清除归档日志后可以恢复访问,但是过不了几天依旧会爆满,所以本文给大家介绍了Oracle归档日志爆满问题的处理方法,需要的朋友可以参考下
    2024-10-10
  • Oracle 临时表 OracleDataAdapter 批量更新的实现思路

    Oracle 临时表 OracleDataAdapter 批量更新的实现思路

    这篇文章主要介绍了Oracle 临时表 OracleDataAdapter 批量更新的实现思路,实现代码需要注意字段名必需大小写一致,需要的朋友可以参考下
    2024-07-07

最新评论