性能优化:B*Tree 索引中的数据块分配(五)

黄玮(Fuyuncat)

资深Oracle DBA,个人网www.HelloDBA.com,致力于数据库底层技术的研究,其作品获得广大同行的高度评价.

编辑手记:循序渐进,让我们继续学习索引分裂的知识。

数据块分配

当索引数据块需要分裂时,会从 Freelist 中找到空闲的数据块满足分配需要,在10224的跟踪文件中,可以看到以下信息记录了新数据块的分配:

如果索引数据块上的数据被全部删除,该数据块就会被放置在 freelist 的前面,但并不从B树结构上删除:

HELLODBA.COM> conn demo/demo Connected. HELLODBA.COM> truncate table idx_split; Table truncated. HELLODBA.COM> alter session set events '10224 trace name context forever,level 1'; Session altered. HELLODBA.COM> begin for i in 1..64 loop insert into idx_split (a, b, c) values (i*3, lpad('A', 100, 'A'), sysdate); end loop; end;

/

PL/SQL procedure successfully completed. HELLODBA.COM> commit; Commit complete. HELLODBA.COM> alter session set events 'immediate trace name treedump level 199127'; Session altered. HELLODBA.COM> delete from idx_split where a between 17*3 and 32*3; 16 rows deleted. HELLODBA.COM> commit; Commit complete. HELLODBA.COM> alter session set events 'immediate trace name treedump level 199127'; Session altered.

从跟踪文件可以看到:当数据块中的实际记录数(rrow)为0时,被放到了 freelist,但是并未从树结构中拿走。

在下一次数据块分裂时,从 freelist 上获取到该数据块,然后将其从树结构中删除,重新分配到树结构中:

HELLODBA.COM> insert into idx_split (a, b, c) values (65*3, lpad('A', 100, 'A'), sysdate); 1 row created. HELLODBA.COM> commit; Commit complete. HELLODBA.COM> alter session set events 'immediate trace name treedump level 199127'; Session altered.

跟踪文件显示了这一数据块被回收利用的过程:

需要注意的是,数据块被放入 freelist 的条件是该数据块上的实际记录数(rrow)为0,而不是等待删除这些数据的事务提交: 需要注意的是,数据块被放入 freelist 的条件是该数据块上的实际记录数(rrow)为0,而不是等待删除这些数据的事务提交:

HELLODBA.COM> delete from idx_split where a between 17*3 and 32*3; 16 rows deleted. HELLODBA.COM> alter session set events 'immediate trace name treedump level 199127'; Session altered.

事务未提交,但从跟踪文件可以看到数据块已经被放到freelist上去了:

如果此时发生分裂,因为该数据块在 freelist 的前列,因此仍然会被获取到,但是,由于其上面的事务并未提交,所以不会被分配:

下一次分裂时,由于其还在 freelist,但事务仍未提交,会再次发生这一过程——这就导致了 IO 的增加

第二种需要注意的情况是,当删除的空数据块被放置到freelist后(事务也已提交),此时它仍然在树结构中,此时如果有正好属于该数据块在树中位置的数据被插入,数据仍然会被写入该数据块上,但并不从freelist上移走:

跟踪内容如下:

此时如果发生分裂,该数据块仍然会被获得,但是分配失败,此时,它才会被从 freelist 上移走:

-------The end

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-08-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏懒人开发

ZooKeeper入门

我们知道,著名的hadoop,kafka,dubbo 都是基于zookeeper而构建。

882
来自专栏风中追风

分布式基础__session 和 cookie的差异

HTTP协议是一种无状态的 通信协议 。那么这就以为着 客户端按道理是需要每次请求之前都要和服务器做连接的。 但是每次都进行这种连接,会非常耗时,并且这些重复...

37310
来自专栏L宝宝聊IT

MySQL架构组成、物理文件组成

MySQL经过多年的改进和完善之后,已经基本具备了所有通用数据库管理系统所需要的相关功能。

492
来自专栏Linux驱动

Linux-kill命令(11)

kill:指定将信号发送给某个进程,常用来杀掉进程,可以通过ps、top命令来查看进程 在默认情况下: 采用编号为15的TERM信号。TERM信号将终止所有不能...

1885
来自专栏Android学习之路

Android 文件下载

1767
来自专栏点滴积累

Ubuntu14.04双网卡主备配置

近日有个需求,交换机有两台,做了堆叠,服务器双网卡,每个分别连到一台交换机上。这样就需要将服务器的网卡做成主备模式,以增加安全性,使得当其中一个交换机不通的时候...

3206
来自专栏Java Edge

操作系统基础知识操作系统的主要特性:分类可以通过命令接口和程序接口方式把它的服务和功能提供给用户程序在执行前已经实现地址转换的方法是静态重定位,执行中为动态重定位.实现角度看,线程分为用用户空间的用户

2937
来自专栏程序员互动联盟

【专业技术】Android 启动性能优化 - uboot篇

时间测量 在mx51平台的uboot里,使用get_timer可以获得比较精确的计时,get_timer的使用贯穿了uboot性能调整的整个过程。 性能优化方法...

3738
来自专栏ImportSource

JDK,JRE,JVM之间的区别

JDK,JRE,JVM之间的区别 JDK, JRE和JVM是java编程语言的核心概念。他们看起来有点相似。作为一个编程者我们似乎也并不是很关心这个概念。但是...

4389
来自专栏coderhuo

记一次文件下载失败问题定位过程

浏览器 <----HTTP连接----> web服务器mongoose <----本地TCP连接---->cgi进程

552

扫码关注云+社区