关于对【oracle索引】的理解与简述

这篇具有很好参考价值的文章主要介绍了关于对【oracle索引】的理解与简述。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/131094864
出自【进步*于辰的博客】

无论oraclemysql,亦或者其他数据库,几乎所有企业级项目都会使用索引,因为这能大大提升程序性能。
oracle索引如何实现性能优化?这就是本文阐述的核心。
参考笔记一,P25.27、P26.28、P30.2;笔记二,P69.5、P70/71。

注:索引是一种数据结构(文中第2项的阐述基于B树)。在阐述中,索引可以是“一棵树”,也可以是“树的一个节点”。而“索引值”指索引中的数据部分(见第2.4项,包括Key column value、rowid),而“索引列值”指记录/数据(即Key column value)。

1、概述

下图红框处是数据表的rowid
关于对【oracle索引】的理解与简述
其是每行记录的唯一标识

从宏观上说,索引是排序后rowid,其排序不是指升序或降序,而是将rowid按照一定的数据结构进行排列。

先说结论:

rowid本身无任何优化查询的功能,索引可以实现优化依赖于数据结构

1.1 创建

  1. 方式1:当添加主键唯一键时,会自动生成索引;
  2. 方式2:create index 索引名 on 表名(字段名)

1.2 查询

  1. user_indexes:查询用户所有索引;
  2. user_ind_columns:查询用户所有索引对应的字段。

1.3 适用场景

  1. 数据量大;
  2. 结果集所包含记录量占数据表记录量的2% ~ 4%左右;
  3. 经常用作条件多表连接的字段;
  4. 所查询字段的记录范围很广;
  5. 所查询字段包含大量 null,因为索引不包含 null

1.4 不适用场景

  1. 数据量小;
  2. 不常作为条件的字段;
  3. 频繁更新的字段;
  4. 索引字段是条件的一部分时。如:where emp.salary * 2 > 10000,此时索引无效;(原因后续说明)
  5. 条件中包含单行函数时。如:where round(salary) > 10000。(除“基于函数的索引”外,见下文)

1.5 补充说明

  1. 优点:优化查询速度。
  2. 不足:占用内存;索引数量多时难以维护;降低 DML 时性能。
  3. 适用场景:当数据量大、不经常进行 DML 且访问频率高时。(对上述阐述的总结)
  4. 一般情况下,先添加索引,后新增记录;(原因后续说明)
  5. 当条件中包含likeinnot in等范围查询时,索引失效。(下文说明)

2、关于索引构建过程(性能优化原理)

启发源自博文《Oracle索引结构》(转发)。

2.1 构建过程

注:

  1. 下文阐述中,id为数据表其中一个字段,非主键(上文阐述:“在创建主键或唯一键时,会自动创建索引”,这种索引称之为主键索引,即索引建立在主键字段上。实际上,可以在任何某个或某多个字段上建立索引,并且索引有多种,见下文);
  2. 上文阐述:“索引所实现的性能优化依赖于所使用的数据结构”。无论是oraclemysql,索引的数据结构都包括B树B+树这2种。下文以B树这种数据结构作为阐述示例,B树也是索引所使用的主要的数据结构之一。

借用那篇博文中的两张图,便于大家理解。
关于对【oracle索引】的理解与简述

  1. rowidid取出,组成一个类似entry的数据结构(见第3项中的索引结构图),即一条记录对应一个“entry”。n个“entry”(n条记录)组成一块(叶节点);
    注:“entry”即索引,不过其不是entry,下文简述索引细节。这里说的entry,大家以Map.Entry理解就行。
  2. n个块由某个块(茎节点)管理,此节点记录着所管理的n个块的信息,即索引
  3. 以此类推。。。
  4. 由某个节点(根节点)管理所有的茎节点

2.2 关于 B+树

这是索引常使用的另一种数据结构,是由B树改进而成,相同的是,两者都属于平衡多路查找树(关于“平衡多路查找树”,后续补充,大家先注意“多路”两字即可,便于理解上述的索引构建过程);不同的是(改进措施):

  1. B树中,所有节点都存放索引数据,因此B树型索引的索引不会重复;而在B+树中,“非叶节点”存放的是所管理节点的信息(即下阶节点的索引),而所有的数据都存放在“叶节点”中,包括“索引列值”和rowid,即索引(见序言注释),因此所有“非叶节点”的索引值最终一定会全部出现在“叶节点”中(即“非叶节点”中的索引会重复1次);
  2. B+树中,会将所有“叶节点”都连接起来,形成“链表”,按索引升序排序,这样是为了便于范围查找,而B树不会。
    注:便于“范围查找”的原理:程序读取数据库的途径是IO流,对于已建立索引的数据表,一次IO,就是将B树/B+树的一个节点读入内存。若所查找的数据分布在多个节点中(范围查找即查找多个节点),则需要多次执行IO。因此,B+树的“链表”可以减少IO的次数。

2.3 补充说明

  1. B树高度较低。如:在一个有几百亿条记录的数据表上建立索引,“树”高度不过 20 余层;
  2. 数据库最小单位是,最小分配单位是存放一个段至少需要一个区;(最后这点我目前也不明其意)
  3. 索引查找不一定比全表扫描(无索引)效率高的原因:
    全表扫描一次可读多个块,而索引查找一次只能读一个。而索引查找的记录可能分散分布于多个块,即索引查找的读取次数可能较多于全局扫描。上文中第1.5项的第5点就是这种情况,因此致使索引失效。
    注:以上阐述基于B树,而B+树的其中一个作用就是应对这种情况。

2.4 索引结构细节

大家看另1张图。
关于对【oracle索引】的理解与简述

可见,索引值由Index entry headerKey column lengthKey column value(列值,即上文中的“索引列值”)、ROWID组成。

3、关于索引分类

3.1 唯一索引

主键或唯一键创建时自动生成;
手动创建:

create unique index 索引名 on 表名(字段名)

3.2 组合索引

当创建索引时,指定多列,就是组合索引。其中,根据上文【构建过程】,可知组合索引的每一个索引列值都包含组合列的各个数据。
注意: 只有当条件(where)中包含此组合所有或大部分字段时,索引才能生效(后续详述)。

3.3 反向键索引

反转索引列值的每个字节,从而实现索引值的均匀分配避免B+树不平衡。(注:“不平衡”是指某个/某些分支较其他同高度分支较长,致使分支“倾斜”的情况)
常用宇连续增长、且索引列值前段相同的字段。如:索引列值为100110021003,经反向键索引转化后变为100120013001

手动创建:

create index 索引名 on 表名(字段名) reverse

3.4 位图索引

适合创建于“低基数”的字段,如:性别国家编号。(注:“低基数”指取值固定取值范围很小、且不经常更新
上文阐述:“索引值由索引列值(记录/数据)和rowid组成”,而位图索引不是。
位图索引不直接存储rowid,而是存储字节位rowid映射,目的是减少空间占用
因此,位图索引适用于数据仓库,不适用于OLTP(关于OLTP,后续说明)。
手动创建:create bitmap index 索引名 on 表名(字段名)

3.5 基于函数的索引

指基于1/n个字段上的函数或表达式创建的索引。简言之,在创建此类索引时,使用了表达式或函数。

限制:表达式中不能使用聚合函数(如:count、max、sum),比较常用的是单行函数;字段类型不能是lob(clob、blob);且当前用户必须拥有query rewrite权限。

示例:

需求:查询用户名,用“基于函数的索引”进行优化。
语句:`... where upper(user_name) = ‘xx’ ...`。
手动创建:`create index 索引名 on 表名(upper(字段名))`

4、最后

本文是“纯阐述”,可谓是0示例,这样难免缺乏可信性可行性。因此,本文的目的是为了让大家对oracle索引所实现的性能优化原理、以及分类有一个大致的了解。

本文完结。文章来源地址https://www.toymoban.com/news/detail-479921.html

到了这里,关于关于对【oracle索引】的理解与简述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于二进制的原码、补码和反码,以及表示范围、常见位运算符和进制转换的理解与简述

    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17963363 出自【进步*于辰的博客】 参考笔记一,P3.13、P5.1;笔记三,P43.1/3、P44.1。 注:我暂且没有整理关于二进制、原码、补码和反码等概念的理论,本文中的阐述都基于

    2024年02月02日
    浏览(46)
  • 关于对索引底层数据结构的理解

    目录 我们在谈论索引底层的数据结构之前,我们不妨先想一下索引是什么以及索引存在的作用 Hash 二叉搜索树与二叉平衡树 多叉平衡查找树(B树) B+树 索引:是一种特殊的文件,包含着对数据库表中所有记录的引用指针,而其的作用也体现的很明确了,我们通过创建索引来

    2024年02月09日
    浏览(45)
  • 【数据库概论】第三章 SQL简述、数据定义和索引

    最早在IBM的关系数据库管理系统原型SystemR上实现,后来美国国家标准局(ANSI)批准SQL作为关系数据库语言的美国标准,同年公布了SQL标准文本。近些年来SQL标准的内容越来越丰富和复杂。目前没有任何一个数据库系统能够支持SQL标准的所有概念和特性,同时不少软件厂商对

    2024年02月05日
    浏览(68)
  • 简述Elasticsearch(ES)是什么 全文搜索概念 (倒排索引 管理文档)

    今天 我们来说说 NoSql 中的 Elasticsearch 大家基本都叫它 ES 官方介绍 它是一个分布式全文搜索引擎 分布式是一个系统架构的概念 而 全文搜索引擎 全文搜索 可以说基本大家天天都在接触 就比如 我们京东购物 想买什么东西 在全文输入框中搜索 它就会在所有物品中 帮你找出需

    2024年01月25日
    浏览(46)
  • 前端TypeScript学习day05-索引签名、映射与类型声明文件

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)              目录 索引签名类型  映射类型 索引查询(访问)类型 基本使用  同时查询多个索引的类型  TypeScript 类型声明文件  概述 TS 的两种文件类型  类型声明文件的

    2024年02月08日
    浏览(48)
  • C++前置声明的理解

    在 C/C++ 中引入一个头文件时,在编译器预处理的时候会将引入头文件的地方简单替换成头文件的内容。这样做的后果是很容易引起头文件的重复引用。所以我们在编写头文件是一般有以下规定来防止头文件被重复包含。 MyWidget.h 编译器在编译时仅仅会编译 .cpp 的文件。 在C

    2024年02月03日
    浏览(75)
  • 深入理解电源纹波与噪声并正确测量简述

    板级电源系统又称电源分配网络(Power Delivery Network,PDN),我们可以将此系统分为稳压模块端(VRM)与用电芯片端(Sink)。电源的AC特性主要包括电源纹波与噪声,我们通常将两者混为一谈,其实纹波与噪声是有区别的,二者的产生原因与解决策略迥异。 纹波 纹波是由直流

    2024年02月14日
    浏览(46)
  • c 语言关于未声明变量赋值机制

      1. 示例代码:   2. 运行结果:

    2024年02月10日
    浏览(44)
  • 阿里云官方关于数据安全保护的声明

    “阿里云监控用户的数据流量?”“真的假的?”随着近日早晨 朱峰@肥鹅旅行 对阿里云的一条朋友圈截图传遍了整个IT圈。   对于网络上的各种传播,以下是阿里云的官方答复,原文如下: 关于数据安全保护的声明 今天有客户反映,使用阿里云服务器部署爬虫业务时发现

    2024年02月14日
    浏览(38)
  • 【计算机视觉】简述对EQ-Net的理解

    最近又看了一些点云分割的文章,近两年点云分割的文章是真的少,不知道是不是点云分割算法接近了末端。这篇文章主要提出了一个基于查询方法的统一范式,它解决了一些不仅仅是点云分割的问题,还解决了三维点云分类和三维目标检测的问题。 文章整体结构如上图,可

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包