概述

近期一个客户的一张单表,每天delete7天前的数据,每天的数据增量没什么变化,理论上来说,delete释放的空间是可重用的,但发现该表段最近一直在增长,现在大小为300G,170G的75% – 100% free space blocks.通常通过 APPEND,直接路径加载的方式会直接扩展SEGMENT,不会重用DELETE的空间,但客户的系统排除了APPEND INSERT。

测试目的

我们知道ASSM的表INSERT查找可用空间机制,会在L2 Hint for inserts指上的L2块,再通过算法确定L1块,查找存在可用空间的数据块,完成INSERT。

客户的系统里,发现一个现象,DUMP SEGMENT HEADER,发现L2 Hint for inserts一直指向最后一个L2块。Segment Type: 1 nl2: 37 blksz: 8192 fbsz: 0L2 Array start offset: 0x00001434First Level 3 BMB: 0x00000000L2 Hint for inserts: 0x1fd54208 <<<

如果ORACLE只是通过L2块查找可用空间,L2 Hint for inserts总是指向最后的L2的话,之前L2块所管理的数据块上数据被DELETE掉,那也没有重用的机会。正常的系统不应该是这样的,下面在我的机器上做一个测试,验证存在多个L2块的系统上,如果前面的L2块管理的块上数据DELETE掉,在表扩展之前,会修改 L2 Hint for inserts的指向,到前面有可用空间的L2,从而重用DELETE释放的空间。

测试步骤如下:

1、创建测试表SQL> create table TEST.tab1(id number,c varchar2(1000)) tablespace users;Table created.

2、INSERT数据,直接产生1个以上L2块为止。我这里有两个L2insert into TEST.tab1 select 0*100000+rownum,rpad('a',1000,'a') from dual connect by rownum<100000;insert into TEST.tab1 select 1*100000+rownum,rpad('a',1000,'a') from dual connect by rownum<100000;insert into TEST.tab1 select 40*100000+rownum,rpad('a',1000,'a') from dual connect by rownum<100000;这里INSERT了大400万数据SQL> @seg test.tab1SEG_MB OWNER SEGMENT_NAME SEG_PART_NAME SEGMENT_TYPE SEG_TABLESPACE_NAME BLOCKS HDRFIL HDRBLK---------- -------------------- ------------------------------ ------------------------------ -------------------- ------------------------------ ---------- ---------- ----------4608 TEST TAB1 TABLE USERS 589824 23 130SQL>SQL> alter system dump datafile 23 block 130;System altered.Segment Type: 1 nl2: 2 blksz: 8192 fbsz: 0L2 Array start offset: 0x00001434First Level 3 BMB: 0x00000000L2 Hint for inserts: 0x05c82088 <<<

3、当前的空间实用情况set serverout onexec show_space('TAB1','TEST');Total Blocks............................589824Total Bytes.............................4831838208Unused Blocks...........................0Unused Bytes............................0Last Used Ext FileId....................23Last Used Ext BlockId...................581760Last Used Block.........................8192*************************************************The segment is analyzed0% -- 25% free space blocks.............00% -- 25% free space bytes..............025% -- 50% free space blocks............125% -- 50% free space bytes.............819250% -- 75% free space blocks............050% -- 75% free space bytes.............075% -- 100% free space blocks...........23775% -- 100% free space bytes............1941504Unused Blocks...........................2816Unused Bytes............................23068672Total Blocks............................585709Total bytes.............................4798128128PL/SQL procedure successfully completed.

4、 DELETE 50万数据,因为我INSERT是顺序的,DELETE id<500000的数据,应该释放的是段的前面的一批BLOCKSSQL> delete TEST.tab1 where id<500000;499995 rows deleted.commit;

5、再查看空间使用情况

75% – 100% free space blocks从DELETE前的237 增长到 71665。set serverout onexec show_space('TAB1','TEST');SQL>SQL> Total Blocks............................589824Total Bytes.............................4831838208Unused Blocks...........................0Unused Bytes............................0Last Used Ext FileId....................23Last Used Ext BlockId...................581760Last Used Block.........................8192*************************************************The segment is analyzed0% -- 25% free space blocks.............00% -- 25% free space bytes..............025% -- 50% free space blocks............125% -- 50% free space bytes.............819250% -- 75% free space blocks............050% -- 75% free space bytes.............075% -- 100% free space blocks...........71665 <<<<75% -- 100% free space bytes............587079680Unused Blocks...........................2816Unused Bytes............................23068672Total Blocks............................514281Total bytes.............................4212989952PL/SQL procedure successfully completed.SQL>

6、INSERT 999行数据进行测试

因为当前 L2 Hint for inserts指向的L2上仍然有可用空间,会发现下面的INSERT并没有使用DELETE释放的这部分空间。SQL> insert into TEST.tab1 select 0+rownum,rpad('a',1000,'a') from dual connect by rownum<1000;999 rows created.SQL> SQL> commit;Commit complete.SQL> select EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where tablespace_name='USERS' and owner='TEST' and segment_name='TAB1' order by extent_id;EXTENT_ID FILE_ID BLOCK_ID BLOCKS---------- ---------- ---------- ----------0 23 128 81 23 136 82 23 144 83 23 152 84 23 160 85 23 168 86 23 176 87 23 184 88 23 192 89 23 200 810 23 208 811 23 216 812 23 224 813 23 232 814 23 240 815 23 248 816 23 256 12817 23 384 12818 23 512 12819 23 640 12820 23 768 12821 23 896 12822 23 1024 12823 23 1152 128....----该段的前部分块上并没有我们刚刚INSERT的数据,说明没有重用DELETE的空间。SQL> select id,dbms_rowid.rowid_relative_fno(rowid) file_id,dbms_rowid.rowid_block_number(rowid) block_id from TEST.tab1 where2 rowid >=dbms_rowid.rowid_create(1,73129,23,127,1) and rowid <=dbms_rowid.rowid_create(1,73129,23,1024,500)3 and id<100;no rows selected

7、继续INSERT 10万行数据

因为最后的L2块上,高水位下面没有这么多的空间存放这10万行数据,可以看到这次重用了之前DELETE释放的空间,同时看到L2 Hint for inserts现在指向到了第一个L2块。SQL> insert into TEST.tab1 select 0+rownum,rpad('a',1000,'a') from dual connect by rownum<100000;99999 rows created.SQL> commit;Commit complete.----INSERT 10万行后,Total Blocks 589824,表总BLOCKS没有增长,75% -- 100% free space blocks从71665减少到60053SQL> set serverout onSQL> exec show_space('TAB1','TEST');Total Blocks............................589824Total Bytes.............................4831838208Unused Blocks...........................0Unused Bytes............................0Last Used Ext FileId....................23Last Used Ext BlockId...................581760Last Used Block.........................8192*************************************************The segment is analyzed0% -- 25% free space blocks.............10% -- 25% free space bytes..............819225% -- 50% free space blocks............025% -- 50% free space bytes.............050% -- 75% free space blocks............050% -- 75% free space bytes.............075% -- 100% free space blocks...........6005375% -- 100% free space bytes............491954176Unused Blocks...........................0Unused Bytes............................0Total Blocks............................528709Total bytes.............................4331184128PL/SQL procedure successfully completed.---可以看到前段的1000个块上有我们刚刚INSERT的数据,说明重用了DELETE释放的空间SQL> select id,dbms_rowid.rowid_relative_fno(rowid) file_id,dbms_rowid.rowid_block_number(rowid) block_id from TEST.tab1 where2 rowid >=dbms_rowid.rowid_create(1,73129,23,127,1) and rowid <=dbms_rowid.rowid_create(1,73129,23,10240,500)3 and id<100000 and rownum<100;ID FILE_ID BLOCK_ID---------- ---------- ----------20445 23 17720446 23 17720447 23 17720448 23 17720449 23 17720450 23 17720451 23 177。。。。。。。。20418 23 18820419 23 18820420 23 18820421 23 18820422 23 18820423 23 18820424 23 18920425 23 18920426 23 18920427 23 18920428 23 18920429 23 18920430 23 18920431 23 19020432 23 19020433 23 19020434 23 19020435 23 19020436 23 19020437 23 19020438 23 19199 rows selected.SQL>SQL> alter system dump datafile 23 block 130;System altered.L2 Hint for inserts的指向也从第二个L2块,换成了第一个L2块。Extent Control Header-----------------------------------------------------------------Extent Header:: spare1: 0 spare2: 0 #extents: 255 #blocks: 589824last map 0x00000000 #maps: 0 offset: 2716Highwater:: 0x05c90080 ext#: 254 blk#: 8192 ext size: 8192#blocks in seg. hdr's freelists: 0#blocks below: 588763mapblk 0x00000000 offset: 254Unlocked--------------------------------------------------------Low HighWater Mark :Highwater:: 0x05c90080 ext#: 254 blk#: 8192 ext size: 8192#blocks in seg. hdr's freelists: 0#blocks below: 588763mapblk 0x00000000 offset: 254Level 1 BMB for High HWM block: 0x05c8e087Level 1 BMB for Low HWM block: 0x05c8e087--------------------------------------------------------Segment Type: 1 nl2: 2 blksz: 8192 fbsz: 0L2 Array start offset: 0x00001434First Level 3 BMB: 0x00000000L2 Hint for inserts: 0x05c00081 <<<<<

总结

猜测正常情况下,L2 Hint for inserts指向的L2块找不到可用空间的时侯,在尝试ALLOCATE新的EXTENT的前,会去判断之前的L2块有没有可用空间。如果有,会修改L2 Hint for inserts,去使用之前的L2管理的块上释放出来的空间。

客户环境中,大量75% – 100% free space blocks的情况下,INSERT不重用释放的空间问题,还需要继续分析!

作者

范计杰,云和恩墨技术顾问,5年大型ORACLE数据库维护经验,擅长性能调优、故障处理等。

墨天轮原文链接:https://www.modb.pro/db/43425(复制到浏览器或者点击“阅读原文”立即查看)

oracle delete 空间增加,实战经验:关于Oracle Delete数据后空间重用问题的测试相关推荐

  1. MySQL 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题)

    MySQL 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题) 1.背景知识 1.1 为什么会有碎片 MySQL 中 insert 与 update 都可能导致页分裂,这样就存在碎片 ...

  2. 空间计量 python_空间计量及R应用:从横截面数据到空间面板(一)

    原标题:空间计量及R应用:从横截面数据到空间面板(一) 空间计量经济学创造性地处理了经典计量方法在面对空间数据时的缺陷,考察了数据在地理观测值之间的关联.近年来在人文社会科学空间转向的大背景下,空间计 ...

  3. 实战经验:关于Oracle Delete数据后空间重用问题的测试

    概述 近期一个客户的一张单表,每天delete7天前的数据,每天的数据增量没什么变化,理论上来说,delete释放的空间是可重用的,但发现该表段最近一直在增长,现在大小为300G,170G的75% – ...

  4. 【Oracle实战经验一】:OracleSpatial自定义空间参考

    OracleSpatial自定义空间参考 1.如何判断OracleSpatial中是否存在该空间参考 2.怎么向OracleSpatial中插入自定义的空间参考 2.1插入地理坐标系统 2.1.1权限 ...

  5. 实战经验:Oracle recyclebin过大导致的Insert逻辑读暴增问题的解决

    墨墨导读:某客户的数据库一条insert某段时间突然变慢,平均单次执行逻辑读暴增至20万,本文分享整个处理过程. 概述 某客户的数据库一条insert语句某段时间突然变慢,平均单次执行逻辑读暴增至20 ...

  6. 实战经验:Oracle DG 的归档缺失修复

    客户某天反馈说:"DG库自0221以来就已经不同步了,请核查." 于是我远程登录进行查看. 故障检查 检查归档同步情况 一.查看数据库的情 select database_role ...

  7. 实战经验:Oracle Lost Write Detection机制导致Select产生大量Redo

    墨墨导读:某客户执行一个Select全表扫,产生大量Redo,需要分析原因.一般延迟块清除导致Select产生Redo,但这个案例中并不是延迟块清除的原因. 分析过程 1.在SELECT执行前保存该s ...

  8. 如何高效利用开源项目增加实战经验?程序员如何做副业?这些你关心的问题一次讲清楚!...

    不久前我在朋友圈做了一个调查,"工作1-3年的程序员,你对自身发展有哪些困惑?"得到了五花八门的答案: "我在一家小公司写Java,工作2年了,感觉很迷茫,项目经验也不多 ...

  9. oracle表中增加字段 sql语句,ORACLE中通过SQL语句(alter table)来增加、删除、修改字段...

    1.添加字段: alter table  表名  add (字段  字段类型)  [ default  '输入默认值']  [null/not null]  ; 2.添加备注: comment on ...

最新文章

  1. Servlet—08—ServletContext; Servlet Config;
  2. SI 和 DI 寄存器的区别
  3. delphi xe http 收不到反馈消息_好消息接二连三!苹果将在双·11当天举办发布会_笔记本新闻...
  4. 敏捷中gwt含义_在您的GWT应用程序中添加JSON功能
  5. LeetCode MySQL 1667. 修复表中的名字
  6. 开发工程师的维护意识存在不?
  7. 开始用Flutter做游戏吧
  8. 各浏览器的Hack写法【转】
  9. 【初级02】java JVM核心技术(2)开发工具和GC策略
  10. lambda函数if_现代 C++:Lambda 表达式
  11. .net站点配置完后常见报错及解决措施
  12. Python数据分析之简书七日热门数据分析
  13. iOS中HTTPS证书验证浅析
  14. Markdown编辑器如何配置图片大小
  15. 强化学习笔记一 N-armed bandit Problem
  16. 连续均匀聚苯乙烯纳米微球造孔剂/氨基化聚苯乙烯微球/羧基功能化马来酸酉干(MA)聚苯乙烯微球
  17. meld的使用 Ubuntu入门之六
  18. Gartner研究:在中国,混合云的采用已成为主流趋势
  19. 使用Echars实现水滴状、环形图、分割图、堆叠、组织架构图、地图轮廓等图表
  20. 搭载3D立体相册网页 加入背景音乐 真香!

热门文章

  1. ZooKeeper安装指南
  2. 微信序列号生成器架构设计及演变
  3. 每日两SQL(2),欢迎交流~
  4. 天勤数据结构:前缀、中缀、后缀表达式的转换与计算
  5. Apache Maven ToolChains的使用
  6. Leet Code OJ 58. Length of Last Word [Difficulty: Easy]
  7. Java实现心跳机制
  8. Leecode22. 括号生成——Leecode大厂热题100道系列
  9. 【简便解法】1035 插入与归并 (25分)_37行代码AC
  10. 【GIF动画+完整可运行源代码】C++实现 选择排序——十大经典排序算法之二