性能优化:B*Tree 索引分裂之存储参数

黄玮(Fuyuncat)

黄玮(Fuyuncat),资深 Oracle DBA,从事 Oracle 数据库管理、维护与开发工作十余年,有丰富的大型数据库设计、开发与维护方面的经验,涉及航空、水利、军工、电信等多个行业。曾供职于某世界著名物流公司,负责公司的电子物流系统的数据库开发和维护工作。2005年创建了个人网www.HelloDBA.com,致力于数据库底层技术的研究,整理和发布了大量关于数据库系统底层机制、存储结构、性能调优以及基础算法方面的文章,获得广大同行的高度评价。

编辑手记:你还在为运维中遇到的索引分裂问题而烦恼吗?恭喜你,今天我们的分享就是为你去除烦恼的,让我们一起去认识索引分裂之存储参数。

我们知道,在表的数据块中,当数据插入时,要保证数据块上剩余空间大于、等于PCTFREE的比例设置,以用于数据更新和多事务处理,从而减少数据迁移(Row Migration)的发生;而当分配新的数据块时,会根据INITRANS的设置预留相应的 ITL slot,保证并发事务能分配到 ITL slot。

在索引中,这两个参数仅在有数据时创建或重建索引才会起作用,且仅在叶子节点上起作用。

INITRANS

INITRANS 在索引数据块上是否起作用,是由索引在创建或重建时是否有数据(即是否会分配数据块)决定的。比较以下代码,第一段代码在 truncate 之后 rebuild(即不会分配索引数据块),因而 ITL slot数量为默认值2;第二段代码在有数据时 rebuild,然后再 truncate,此时再插入数据产生的新的索引块上 ITL slot数量就受到 INITRANS 的控制:

需要注意的是,当数据块上ITL Slot数量大于起作用的 INITRANS 时,在分裂时被“继承”。在以下例子中,在 rebuild 时,指定了 INITRANS 为3:

我们同时启动4个事务作用在最后一个节点,导致该数据块上分配5个(加一个递归事务ITL slot)ITL slot:

然后将它们全部提交或回滚,再插入数据,造成分裂:

Dump 出分裂的数据块,可以看到所有数据块都被分配了5个 ITL slot,而不是 INITRANS(3)的数量:

PCTFREE

PCTFREE在分裂时则被忽略。在上述例子中,我们找到一块发生9-1分裂产生的数据块,可以看到其空闲空间为44b,空闲率为44/2048=2.1%,远远小于我们rebuild时的设定值(60)。

我们再插入一些中间数据,造成5-5分裂:

可以看到,发生分裂的数据块的空闲率为556/2048=27.1%,可见PCTFREE(60)也被忽略了。

--- Fuyuncat TBC ---

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

IMVC(同构 MVC)的前端实践

导语 随着 Backbone 等老牌框架的逐渐衰退,前端 MVC 发展缓慢,有逐渐被 MVVM/Flux 所取代的趋势。 然而,纵观近几年的发展,可以发现一点,...

2066
来自专栏跨界架构师

分布式系统中的必备良药 —— 全局唯一单据号生成

  我们作为一个软件系统,肯定到处充满着各种单据,也必然需要有各种单据号与之对应。比如:电商行业的订单号、支付流水号、退款单号等等。SCM的采购单号、进货单号、...

682
来自专栏圣杰的专栏

DDD理论学习系列(6)-- 实体

1.引言 实体对应的英语单词为Entity。提到实体,你可能立马就想到了代码中定义的实体类。在使用一些ORM框架时,比如Entity Framework,实体作...

2048
来自专栏Android机动车

Android模块化开发方案

随着业务的不断发展壮大,移动端所承担的功能也越来越重,特别是代码几易其主之后开始变得杂乱无章,牵一发而动全局的事情时常发生。为了应对团队壮大之后的开发模式,我们...

752
来自专栏琦小虾的Binary

Node.js 异步编程基础理解

参考地址:《深入理解node.js异步编程:基础篇》 一、概述 目前开源社区最火热的技术当属 Node.js 莫属了,作为使用 Javascript 为主要开发...

22510
来自专栏腾讯移动品质中心TMQ的专栏

【UTP自动化测试平台系列之终章】前端探索之路

UTP自动化测试平台是TMQ的一个联合项目,目的是方便大家更好地开展自动化测试建设工作,减少重复平台建设的成本,提高产品的自动化测试效率。但是随着项目规模与用户...

35211
来自专栏Golang语言社区

C++ 实现银行排队服务模拟

教程简介:使用 C++对银行排队服务进行模拟,以事件驱动为核心思想,手动实现模板链式队列、随机数产生器等内容,进而学习概率编程等知识。作为可选进阶,这个模型同时...

4215
来自专栏架构师之路

微信钱包中58到家首页为什么这么快

原文标题《前后端分离和模块化-58到家微信首页重构之路》【深度前端干货】 微信钱包内的58到家全新首页已经上线,感兴趣的同学们可以在微信中打开“我的->钱包->...

2717
来自专栏Golang语言社区

C++ 实现银行排队服务模拟

教程简介:使用 C++对银行排队服务进行模拟,以事件驱动为核心思想,手动实现模板链式队列、随机数产生器等内容,进而学习概率编程等知识。作为可选进阶,这个模型同时...

34312
来自专栏IT大咖说

产品研发做到又快又好的一个核心原则

内容来源:2018 年 5 月 19 日,G7汇通天下技术合伙人廖强在“PHPCon China 2018 技术峰会”进行《敏捷工程实践与自动化》演讲分享。IT...

662

扫描关注云+社区