一、表的占用空间大小释放原理

背景:

生产环境中,经常会遇到表由于数据不断插入,导致空间越来越大,由于前期配置问题,没有做分区或者其他优化,而且生产数据实时向表插入。要删除历史数据来释放空间。

分析:

(1)没做分区表:

由于没有分区表,所以无法分块对表进行清理。

(2)表实时插入数据,数据量大,要保留部分数据:

无法采用将有效数据插入另一个表,drop原表,修改名字来删除原表,或者truncate原表,来释放空间。

(3)删除历史数据:

用delete from 加条件,删除历史数据。

现象:

例子:wxk_big_tab_bak 表。

SELECT COUNT(*) FROM wxk_big_tab_bak

168522

SQL> selectround(BYTES/1024/1024,2)||'M' from user_segments where segment_name='WXK_BIG_TAB_BAK';

ROUND(BYTES/1024/1024,2)||'M'

-----------------------------------------

21M

对wxk_big_tab_bak 进行delete操作。

DECLARE

row_num number := 0;

begin

for gyj_test IN (select ROWID from wxk_big_tab_bak t where t.id  <=168522 )  LOOP

delete from wxk_big_tab_bak  WHERE ROWID = gyj_test.rowid ;

row_num := row_num +1;

---100条提交一次,可根据需要修改

if mod(row_num,100) = 0 THEN

commit;

end if;

end loop;

commit;

end;

/

执行删除后

SELECT COUNT(*) FROM wxk_big_tab_bak

0

再次查看

SQL> selectround(BYTES/1024/1024,2)||'M' from user_segments where segment_name='WXK_BIG_TAB_BAK';

ROUND(BYTES/1024/1024,2)||'M'

-----------------------------------------

21M

还是21M没有变化。

但是表里已经没有数据了。

这里注意,再次用插入命令新的数据,表的大小没有变化。由此可见,数据的空间确实被释放了,可以存储其他信息,但是从查询上看,表占用的空间大小没有缩小,没有整理表碎片。(高水位问题)。

如果需要将表的空间进行缩小,有两个办法:

(1)move

(2)shrink

1、对于空间的要求,shrink不需要额外的空间,move需要两倍的空间

2、shrink的算法是从segment的底部开始,移动row到segment的顶部,移动的过程相当于delete/insert操作的组合,在这个过程中会产生大量的undo和redo信息。

3、move是直接移动数据块的位置,鉴于上面的原因,在使用shrink的时候,耗时可能非常长,通常慢于move。

4、move是不能在线进行的,而且move后相应的索引也会失效。shrink的一个优点是能在线进行,不影响表上的DML操作,当然,并发的DML操作在shrink结束的时刻会出现短暂的block;shrink的另外一个优点是在碎片整理结束后,表上相关的index仍然enable。

对于一般系统,可采用shrink方式(仅仅适用于堆表,且位于自动段空间管理的表空间(堆表包括:标准表,分区表,物化视图容器,物化视图日志表)):

(1)启用行记录转移(enable row movement)

alter table wxk_big_tab_bak enable row movement ;

(2)这里先执行compact 再 到空闲时间执行 cascade

ALTER TABLE wxk_big_tab_bak SHRINK SPACE COMPACT

ALTER TABLE wxk_big_tab_ba SHRINK SPACE cascade

--compact:仅仅是缩小表和索引,并不移动高水位线,不释放空间

--cascade:缩小表及其索引,并移动高水位线,释放空间

对于重要系统,最好还是采用move

(1)move前最好逻辑备份待整理的表;

(2)--查看索引

select index_name,table_name,tablespace_name,index_type,status  from dba_indexes  where table_owner='WXK'
(3)对于大表,建议开启并行和nologging
    alter table wxk_big_tab_bak MOVE nologging parallel 2;
(4)整理完毕后重建相关的索引
    alterindex SYS_C0011093 rebuild nologgingparallel 2;
(5)恢复表和索引的并行度、logging
  alter table wxk_big_tab_bak logging parallel 1;

最后再次查看

SQL>select round(BYTES/1024/1024,2)||'M' from user_segments wheresegment_name='WXK_BIG_TAB_BAK';

ROUND(BYTES/1024/1024,2)||'M'

-----------------------------------------

.06M

此时,表占用空间被释放。

本文再附一个表空间利用率sql

SELECT A.TABLESPACE_NAME,      
       FILENUM,   
       TOTAL "TOTAL (MB)",  
       F.FREE "FREE (MB)",
       TO_CHAR(ROUND(FREE * 100 / TOTAL, 2), '990.00') "FREE%", 
       TO_CHAR(ROUND((TOTAL - FREE) * 100 / TOTAL, 2), '990.00') "USED%",    
       ROUND(MAXSIZES, 2) "MAX (MB)"
  FROM (SELECT TABLESPACE_NAME,          
               COUNT(FILE_ID) FILENUM,        
               SUM(BYTES / (1024 * 1024)) TOTAL,          
               SUM(MAXBYTES) / 1024 / 1024 MAXSIZES      
          FROM DBA_DATA_FILES       
         GROUP BY TABLESPACE_NAME) A,     
       (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES / (1024 * 1024))) FREE     
          FROM DBA_FREE_SPACE      
         GROUP BY TABLESPACE_NAME) F
 WHERE A.TABLESPACE_NAME = F.TABLESPACE_NAME

Oracle表的空间释放,碎片整理记录相关推荐

  1. CMDS目的端数据库碎片整理记录

    CMDS目的端数据库碎片整理记录 看看数据库里面需要做整理的表有哪些,条件可以根据需求稍微改动一下 SQL> select * from ( 2 select a.owner, 3 a.tabl ...

  2. oracle查看表和索引碎片,Oracle 表空间索引存储与碎片检查

    Oracle 表空间索引存储与碎片检查 Oracle 表空间索引存储检查,Oracle 表空间索引碎片查看,包括查看系统表中的用户索引.索引的存储情况检查.索引的选择性.确定索引的实际碎片. 1.查看 ...

  3. ORACLE表空间的碎片整理

    oracle作为一种大型数据库,广泛应用于金融.邮电.电力.民航等数据吞吐量巨大,计算机网络广泛普及的重要部门.对于系统管理员来讲,如何保证网络 稳定运行,如何提高数据库性能,使其更加安全高效,就显得 ...

  4. MySQL数据库查看表占用空间大小及碎片整理

    查询数据库所占空间 1 2 3 select concat(round(sum(data_length/1024/1024),2),'MB') as data from  information_sc ...

  5. oracle 表空间 碎片,Oracle表空间碎片整理

    作为影响数据库性能的一个因素,数据库表空间碎片,应当引起DBA的重视,及时发现并整理碎片是DBA基本维护内容,以提高数据库性能. Oracle数据库表空间.段.区.块简述 表空间(tablesapce ...

  6. Oracle表空间碎片查询以及整理

    一.查看表空间碎片的方法 查看fsfi值 /* Formatted on 2017/9/21 13:42:29 (QP5 v5.240.12305.39476) */ select a.tablesp ...

  7. oracle 表的碎片化整理

    数据库在日常的使用过程中,不断的insert,delete,update,导致表和索引出现碎片.这会导致HWM之前有很多的空闲空间,而oracle在做全表扫描的时候会读取HWM一下的所有块,这样会产生 ...

  8. oracle表稅片整理,oracle_Oracle表碎片整理操作步骤详解,高水位线(HWL)下的许多数据 - phpStudy...

    Oracle表碎片整理操作步骤详解 高水位线(HWL)下的许多数据块都是无数据的,但全表扫描的时候要扫描到高水位线的数据块,也就是说oracle要做许多的无用功!因此oracle提供了shrink s ...

  9. oracle 表碎片化处理,oracle数据库碎片化管理

    ******************************************************************************** 1.表空间碎片 *********** ...

最新文章

  1. android8.0自适应图标,适配8.0+的自适应图标
  2. JAVA day06 继承,super,方法的重写,抽象类
  3. 矩阵维度必须一致是什么意思_糖化肌肤是什么意思?抗糖养肤你必须知道这些...
  4. Java设计模式(7)——装饰者模式
  5. jquery中防止和其他JS框架冲突的办法
  6. 哪种修复redis未授权访问漏洞的方法是相对不安全的_redis漏洞复现
  7. 小美赛(认证杯)ABCD题翻译
  8. 大数据爬虫的一些小目标
  9. 蒙特卡罗类型概率算法
  10. 2021-02-07 USR-WIFI232-B2 串口转WIFI模块
  11. ssm药品大全网站的设计与实现毕业设计源码281128
  12. 湖北武汉施工员报考排给水和电气的施工方法建筑七大员报考
  13. ai智能写作如何快速写文?
  14. 三个等于号===与两个等于号==
  15. 再见Spring Security、推荐一款功能强大的权限认证框架
  16. 多线程、并发/并行、自定义线程类、线程安全、守护线程、定时器、线程状态、线程池
  17. 怎么让限制复制的网站能复制
  18. 多线程的三种设计模式的介绍
  19. 利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
  20. ZigBee无线传感网络的地址分配机制

热门文章

  1. 都说测试行业内卷严重,环境恶劣,那么未来测试行业会如何发展?
  2. pagehelper oracle分页,Pagehelper分页插件的使用
  3. scheduler performance testing
  4. STM32连接机智云(踩雷日记)
  5. PSIM仿真之:仿真时如何修改元件参数值(How to change variables mid-simulation with PSIM)
  6. iOS - CoreData了解和简单应用
  7. 【OpenCV】77 视频读写与处理
  8. 穿行测试工作底稿 软件行业,内部控制审计工作底稿之确定控制是否得到执行(穿行测试).doc...
  9. 使用Diskpart磁盘管理中的clean命令,误删除了移动硬盘分区后,找回分区并恢复数据方法。(U盘启动盘)
  10. EVM 挣值管理-高项笔记5