性能优化: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 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

Python+matplotlib绘制柱状图并设置坐标轴有效刻度

问题描述:在使用matplotlib绘图时,一般会自动设置坐标轴刻度。很多时候,这个自动设置并不合适,用户更希望绘制结果的坐标轴上只显示有效刻度,也就是只显示有...

823
来自专栏小巫技术博客

Building TensorFlow on Android(译)

981
来自专栏Java技术分享

redis集群原理

 redis是单线程,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了。

2849
来自专栏Java技术栈

浅析负载均衡的6种算法,Ngnix的5种算法。

常见的几种负载均衡算法 ? 1、轮询法 将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。 2、...

29912
来自专栏小小挖掘机

windows下使用word2vec训练维基百科中文语料全攻略!(一)

训练一个聊天机器人的很重要的一步是词向量训练,无论是生成式聊天机器人还是检索式聊天机器人,都需要将文字转化为词向量,时下最火的词向量训练模型是word2vec,...

2676
来自专栏TensorFlow从0到N

TensorFlow从0到1 - 1 - Hello, TensorFlow!

在学习任何新的编程语言时,我们都会在第一时间完成Hello World,以宣告自己开发环境的完美搭建。TensorFlow也不例外。TensorFlow充分考...

3363
来自专栏林德熙的博客

C# 使用转换语义版本号

本文告诉大家如何转换语义版本号,那么什么是语义版本号,语义版本号(semantic version)就是版本号带 alpha 等的版本号

811
来自专栏企鹅号快讯

Python人工智能之图片识别,Python3一行代码实现图片文字识别

我们以识别诗词为例 下面是我们要识别的图片 ? 先看下效果图 ? 我们运行代码后识别的结果,有几个字没有正确识别,但是大多数字都能识别出来。 一行代码就能识别图...

4656
来自专栏性能与架构

Nginx的I/O性能为什么比Apache更高效?

Nginx与Apache的I/O性能差距源于他们采用不同的I/O模型 Apache - select模型 Nginx - epoll模型 特点对比 se...

34410
来自专栏软件开发 -- 分享 互助 成长

用例图

用例图从用户的角度描述对软件产品的需求,并分析产品所需要的功能和动态行为。 用例图的组成元素: 1、参与者:代表系统的用户(可以是人、物、时间或者其他系统),用...

2465

扫码关注云+社区