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

相关文章

来自专栏云计算

A Kubernetes Service Mesh(第9部分):使用gRPC的乐趣和收益

原文地址:https://dzone.com/articles/a-service-mesh-for-kubernetes-part-ix-grpc-for-f...

6549
来自专栏简书专栏

目标检测第1步-运行tensorflow官方示例

在进行本文操作之前,需要先安装好tensorflow的gpu版本。 本文作者的环境:python3.6、Windows10、tensorflow_gpu1.1...

9653
来自专栏WOLFRAM

大家都记得去年Wolfram举办的一行代码比赛吗???

1633
来自专栏Java技术分享

redis集群原理

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

3819
来自专栏Python小屋

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

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

1683
来自专栏性能与架构

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

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

38310
来自专栏哲学驱动设计

OpenExpressApp 框架结构(2)

    上次随便画了一篇关于GIX4项目目前的类的结构图(见:GIX4 目前大致的类结构),目的是为了更好的认识系统,并对其进行改进。发现AutoUI部分的耦合...

1869
来自专栏企鹅号快讯

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

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

3268
来自专栏Java技术栈

Zookeeper面试题锦集

1、zookeeper是什么框架? 2、有哪些应用场景? 3、使用什么协议? 4、说说分布式一致性算法Paxos 5、说一说选举算法及流程 6、zookeepe...

4868
来自专栏TensorFlow从0到N

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

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

4303

扫码关注云+社区

领取腾讯云代金券