Oracle--索引

文章目录

      • 一、索引是什么?
      • 二、索引的原理
      • 三、索引的特征
      • 四、创建索引的方式
      • 五、怎么确认索引
      • 六、案列
      • 七、复合索引

一、索引是什么?

索引(INDEX)是数据库中用于提高查询效率的一种数据结构。它可以加速数据库表的数据查找、过滤和排序等操作。索引是一种类似于字典的数据结构,用于快速查找表中的某个值,类似于书本中的目录页,可以帮助用户快速找到所需内容。

二、索引的原理

Oracle 中的索引是基于 B-Tree 数据结构实现的,也称为 B-Tree 索引。B-Tree 索引是一种多层索引的树型结构,用于提高查询和检索操作的效率,为了优化查询性能,索引应针对经常被查询的列创建。查询过程中,数据库会首先检查查询条件中涉及的列是否有相关的索引,然后使用这些索引来快速定位、过滤和排序查询结果,从而大大提高查询效率。

如:
查询 EMPLOYEES表的所有内容
select * from EMPLOYEES;

不加索引读,一行一行的读,并且随机读,在读的过程中有可能会遇到有些列的值比较长,影响查询效率。
在这里插入图片描述

加了索引后,假如索引列为employee_id
索引就由rowid+employee_id组成
加了索引后, 通过索引,可以快速定位到包含特定值或满足特定条件的数据行,而 ROWID 提供了对这些数据行的直接引用。 当执行查询时,如果满足索引条件,Oracle 数据库引擎会使用索引来查找对应的 ROWID,然后利用 ROWID 直接访问和获取相应的数据行。由于索引的结构通常更小且更容易扫描,这种方式可以提高查询的效率。

在这里插入图片描述

三、索引的特征

1.快速检索:通过索引,可以快速定位到包含特定值或满足特定条件的数据行,避免全表扫描和数据的多次IO操作,提高查询的效率。
2.占用空间:索引需要占用一定的存储空间,以存储索引键和指向对应数据行的指针。随着索引的增多,可能会增加数据库的存储需求,索引是模式对象SCHEMA.OBJECT它高于数据对象。和表一样索引也有自己的段结构
3.对数据更新的影响:每次对数据表的更新(插入、删除、修改)都会影响与之相关的索引表,因此会增加维护索引的成本
4.索引和索引所在的表无关
5.ORACLE自身进行自动使用和维护

在下列情况下应该创建索引
1.经常被查询的列:对于经常被查询的列,例如常用的查询条件、连接条件或排序列,可以创建索引以加快相关查询的速度。
2.列包含较大范围的值
3.在where子句或联结条件中频繁使用一个列或者多个列
4.表很大 但是语句多数查询检索的行不到表中枢的百分之二至百分之四
5.排序和分组操作:如果经常进行排序或分组操作,可以创建索引来加速这些操作

在下列情况下不应该创建索引,通常不值得创建索引
1.表比较小
2.在查询中不经常使用列作为条件
3.语句多数查询检索的数据行要超过表总数的百分之二至百分之四
4.表更新比较频繁 因为索引页跟着一起进行频繁更新
5.被索引的列将作为表达式的一部分进行引用 比如说对这个列进行函数操作 函数会导致索引出问题
当表比较小的时候,全表扫描的速度会高于索引参与查询的速度。

四、创建索引的方式

在 Oracle 数据库中,可以使用以下两种方式创建索引:隐式创建(自动创建)和显式创建(手动创建)。

隐式创建(自动创建)索引:当定义了主键约束或唯一键约束时,Oracle 会自动为相应的列创建唯一索引。例如,创建名为 students 的表,并定义 id 列为主键,代码如下:

CREATE TABLE students ( id NUMBER PRIMARY KEY, name VARCHAR2(50), ... );

在上述示例中,id 列作为主键,会自动创建一个唯一索引。

显式创建(手动创建)索引:用户可以根据需要手动创建非唯一索引,以加速对数据的检索访问。使用 CREATE INDEX 语句可以实现显式创建索引的操作。例如,为名为 students 的表的 name 列创建一个非唯一索引,可以使用以下 SQL 语句:

CREATE INDEX idx_students_name ON students(name);

在上述示例中,idx_students_name 是索引的名称,students 是表的名称,name 列是要创建索引的列名。

五、怎么确认索引

1.查询执行计划:在数据库管理系统中,可以使用查询执行计划(query execution plan)来查看查询的执行过程,包括使用的索引和执行的操作。通过查询执行计划,可以确认是否使用了索引以及索引的效果。

2.行数和响应时间:可以对比使用索引和不使用索引的情况下,对同一个查询语句的执行时间和返回结果的行数进行对比。如果使用了索引,查询的响应时间可能更短,返回结果的行数可能更少。

3.相关视图
USER_INDEXES 数据字典视图包含索引的名称以及唯一性
USER_IND_COLUMNS 该数据字典视图包含索引名 表名 和 列名

4.查询当前的SCHEMA有哪些索引

SELECT IC.INDEX_NAME,IC.COLUMN_NAME,IC.COLUMN_POSITION COL_POS,ix.uniqueness
FROM user_indexes ix ,user_ind_columns ic
WHERE IC.INDEX_NAME=IX.INDEX_NAME
AND IC.TABLE_NAME=IX.TABLE_NAME;

六、案列

1.创建一个表DEPTS

create table DEPTS as select * from DEPARTMENTS where 1=1;
select * from DEPTS;

2.创建索引DEPTS_DEPARTMENT_ID_IDX

CREATE INDEX DEPTS_DEPARTMENT_ID_IDX ON DEPTS(DEPARTMENT_ID);

3.查询当前SCHEMA索引是否存在DEPTS_DEPARTMENT_ID_IDX

SELECT IC.INDEX_NAME,IC.COLUMN_NAME,IC.COLUMN_POSITION COL_POS,ix.uniqueness
FROM user_indexes ix ,user_ind_columns ic
WHERE IC.INDEX_NAME=IX.INDEX_NAME
AND IC.TABLE_NAME=IX.TABLE_NAME;

在这里插入图片描述
4. 打开 Autotrace (SET AUTOTRACE ON )功能, 获取 SQL 查询语句执行的详细统计信息,包括查询的执行计划。
set autotrace on
select department_id from hr.DEPTS where department_id =10 ;
在这里插入图片描述

基于函数的索引

创建语句

CREATE INDEX upper_dept_name_idx on depts(UPPER(DEPARTMENT_NAME));

查看是否创建索引成功

SELECT * FROM DEPTS WHERE UPPER(DEPARTMENT_NAME)='SALES';

在这里插入图片描述

删除索引

DROP INDEX upper_dept_name_idx;

扩展:

在对数据库表进行索引设计和优化时,不能简单地认为加上索引就能提高数据库性能,或者创建了索引之后就能一直有效。
数据库表的数据量、表结构、查询语句等因素都会影响索引的有效性和对查询性能的影响。索引设计需要根据实际应用场景和查询需求,综合考虑优化数据库性能的多个方面,例如查询频率、查询复杂度、并发访问等。此外,要根据表结构、数据分布、数据类型等因素选择适合的索引类型和创建方式,以避免索引滥用和不必要的资源浪费。

七、复合索引

复合索引是在数据库表中使用多个列作为索引键的索引类型。它可以提高在多个列上进行查询或排序的性能。

假设我们有一个名为 “employees” 的表,其中包含以下列:employee_id、first_name、last_name 和 department_id。现在,我们希望在 first_name 和 last_name 列上创建一个复合索引。

在这里插入图片描述

创建复合索引:

CREATE INDEX idx_employees_name ON hr.employees (first_name, last_name);

创建了复合索引后,数据库会在 first_name 和 last_name 列上建立一个索引数据结构,这样在查询或排序时可以更高效地访问数据。

使用复合索引的好处是可以加快根据多个列的条件进行过滤的查询。例如,下面的查询将会受益于复合索引:

SELECT * FROM HR.employees WHERE first_name = 'Steven' AND last_name = 'King';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 协程

1. 协程 协程,又称微线程,纤程。英文名Coroutine。 https://www.cnblogs.com/coder-qi/p/10163416.html 协程不是计算机提供的,是人为创造的上下文切换技术,也可以被称为微线程。简而言之 其实就是在一个线程中实现代码块相互切…

Lesson 08 string类 (中)

C:渴望力量吗,少年? 文章目录 二、string类的介绍与使用2. 使用(5)string类对象的修改操作 三、拷贝1. 引入2. 浅拷贝3. 深拷贝 总结 二、string类的介绍与使用 2. 使用 (5)string类对象的修改…

Scrum敏捷开发流程及支撑工具

Scrum是一种敏捷开发框架,用于管理复杂的项目。以下这些步骤构成了Scrum敏捷开发流程的核心。通过不断迭代、灵活应对变化和持续反馈,Scrum框架帮助团队快速交付高质量的产品。 以下是Scrum敏捷开发流程的基本步骤: 产品Backlog创建&#xf…

微服务--06--Sentinel 限流、熔断

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.微服务保护雪崩问题服务保护方案1.1.请求限流1.2.线程隔离1.3.服务熔断 2.Sentinel2.1.介绍和安装官方网站:[https://sentinelguard.io/zh-cn/](https…

打造高效项目团队,离不开有效的反馈机制

为了确保项目高效交付,项目经理需要在管理过程中及时发现问题并解决,所以80%的时间都在进行沟通以及各种项目汇报。但项目经理往往会陷入低频沟通、无意义汇报的困局,进而导致四处救火、项目各种延误、团队的工作效率低下。例如: …

Leetcode2336 无限集中的最小数字

题目: 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, ...] 。 实现 SmallestInfiniteSet 类: SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。int popSmallest() 移除 并返回该无限集中的最小整数。void addBack(int nu…

VERAS:AI驱动的Revit可视化渲染插件

Veras 是一款基于生成式AI 的可视化工具,可以使用自然语言生成3D渲染效果,兼容Revit、Rhino 和 SketchUp。Veras for Revit工具使用 Revit 模型内部的 3D 视图。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编…

如何把ipa文件(iOS安装包)安装到iPhone手机上? 附方法汇总

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 技术细节 目录 Appuploader 常见错误及解决方法 苹果APP安装包ipa如何安装在手机上?很多人不知道怎么把ipa文件安装到手机上,这里就整理了苹果APP安装到iOS设备上的方式,仅供参考 苹…

说说你对slot的理解?slot使用场景有哪些?

面试官&#xff1a;说说你对slot的理解&#xff1f;slot使用场景有哪些&#xff1f; 一、slot是什么 在HTML中 slot 元素 &#xff0c;作为 Web Components 技术套件的一部分&#xff0c;是Web组件内的一个占位符 该占位符可以在后期使用自己的标记语言填充 举个栗子 <t…

安科瑞智能照明系统在福建二建大厦项目上的应用

【摘要】&#xff1a;智能化已经成为当今建筑发展的主流技术、涵盖从空调系统、消防系统到安全防范系统以及完善的计算机网络和通信系统。但是长期以来、智能照明在国内一直被忽视、大多数建筑物仍然沿用传统的照明控制方式、部分智能大厦采用楼宇自控&#xff08;BA&#xff0…

vue2全局混入正确使用场景和错误场景示例

全局混入在 Vue.js 中的使用场景需要谨慎考虑&#xff0c;因为它会影响所有组件。以下是一些正确和错误的使用场景的例子&#xff1a; 正确的使用场景&#xff1a; 全局工具方法&#xff1a; // 正确的使用场景 Vue.mixin({methods: {$formatDate: function (date) {// 格式化…

算法面试题--树与对象数组的转化

1. Array -> Tree var arr [{ id: 12, parentId: 1, name: "朝阳区" },{ id: 241, parentId: 24, name: "田林街道" },{ id: 31, parentId: 3, name: "广州市" },{ id: 13, parentId: 1, name: "昌平区" },{ id: 2421, parentId:…

曲面拼接oled屏幕为何受到企业展览青睐

曲面拼接OLED屏幕受到企业展览青睐的原因主要有以下几点&#xff1a; 创新的技术&#xff1a;曲面拼接OLED屏幕采用先进的OLED技术&#xff0c;具有自发光原理&#xff0c;可以实现真正的黑色和高对比度&#xff0c;呈现出生动的图像。其每个像素都能独立发光&#xff0c;没有背…

Windows系统下使用PHPCS+PHPMD+GIT钩子

前言 使用PHPCSGIT钩子保障团队开发中代码风格一致性实践 使用PHPMD提高代码质量与可读性 0.介绍 PHP_CodeSniffer php代码嗅探器 包含phpcs(php code standard 代码标准) phpcbf(php code beautify fix 代码美化修复) 是一个代码风格检测工具,着重代码规范 它包含两类脚本…

有时出厂重置BIOS是解决电脑问题和保持其最佳性能的好办法,主要有两种方法

​BIOS是计算机开机时启动的第一个程序&#xff0c;它有助于执行一些基本的计算机操作&#xff0c;并管理计算机和安装在计算机上的操作系统之间的命令。与任何其他程序一样&#xff0c;如果在启动计算机时遇到问题或在计算机中添加了新硬件&#xff0c;则可能需要将BIOS重置为…

「幻醒蓝」可视化主题套件|融合天空的清澈与海洋的深邃

现如今&#xff0c;数据可视化已成为信息传递的重要手段之一。在这样一个信息爆炸的时代&#xff0c;向人们传达正确的信息显得尤为重要。为此&#xff0c;可视化主题套件应运而生&#xff0c;提供了一种多样化的、可视化的方式来展示数据。不同的主题套件能够适应不同的信息传…

免费的电脑AI写作工具-5款好用的智能AI写作软件

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;电脑AI写作已经成为现代写作领域的一项不可或缺的工具。通过深度学习和自然语言处理的融合&#xff0c;AI写作软件得以模拟人类的创造性和表达能力&#xff0c;为我们提供了快速、高效地生成优质文字内容的可…

15.spring源码解析-invokeBeanFactoryPostProcessors

BeanFactoryPostProcessor接口允许我们在bean正是初始化之前改变其值。此接口只有一个方法: void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);有两种方式可以向Spring添加此对象: 通过代码的方式: context.addBeanFactoryPostProcessor 通过xml…

springboot+netty化身Udp服务端,go化身客户端模拟设备实现指令联动

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 springbootnetty化身Udp服务端&#xff0c;go化身客户端模拟设备实现指令联动 &#x1f517;涉及链接前言异步通信的优势异步通信的优势&#xff1a;异步通信的应用场景&…

电子学会 2023年9月 青少年软件编程Python编程等级考试二级真题解析(选择题+判断题+编程题)

青少年编程Python编程等级考试二级真题解析(选择题+判断题+编程题) 2023年9月 一、选择题(共25题,共50分) 以下代码运行结果是?( ) A. 宸宸 B. 杭杭 C. 玉玉 D. 州州 答案选:A 考点分析:考察python 列表操作 jxw=yyh[2][0],jxw的值是“拱宸桥”,jxw[1]的值是“宸”…