Oracle--索引

news2024/10/7 14:28:34

文章目录

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

一、索引是什么?

索引(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.coloradmin.cn/o/1270678.html

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

相关文章

hive创建ES外部表过程中的问题

一、缺少jar包:httpclient 报错: “HiveServer2-Handler-Pool: Thread-696” java.lang.NoClassDefFoundError: org/apache/commons/httpclient/protocol/ProtocolSocketFactory 需要加载commons-httpclient-3.1.jar 二、缺少jar包:eshado…

功率信号源简介及其应用有哪些内容

功率信号源是一种能够提供稳定输出功率信号的设备或电路。它在许多领域中都有广泛的应用。以下是一些关于功率信号源的内容: 功率信号源简介:功率信号源是一种电子设备或电路,它能够提供稳定的输出功率信号。功率信号源通常由放大器、稳压器、…

MATLAB中imbothat函数用法

目录 语法 说明 示例 使用底帽和顶帽滤波增强对比度 imbothat函数的功能是对图像进行底帽滤波。 语法 J imbothat(I,SE) J imbothat(I,nhood) 说明 J imbothat(I,SE) 使用结构元素 SE 对灰度或二值图像 I 执行形态学底帽滤波。底帽滤波计算图像的形态学闭运算&#…

Linux--2.6内核调度和环境变量

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、Linxu2.6内核进程调度队列1、一个CPU拥有一个runqueue2、优先级3、优先级活动队列4、过期…

用纯 CSS 实现网格背景

是不是在日常开发中经常遇到实现网格的需求,网格通常对网页中展示的元素能起到很好的定位和对齐作用。 这里介绍如何只通过 CSS 来实现这个需求? 使用背景图 这里我们的背景图使用 SVG 来创建,首先,创建绘出一个正方形&#xff0c…

学会XPath,轻松抓取网页数据

一、定义 XPath(XML Path Language)是一种用于在 XML 文档中定位和选择节点的语言。XPath的选择功能非常强大,可以通过简单的路径选择语法,选取文档中的任意节点或节点集。学会XPath,可以轻松抓取网页数据&#xff0c…

机器人仿真之Vrep中Graph功能下的各种曲线问题汇总

vrep,机器人仿真软件大佬,在仿真机械臂轨迹时涉及到末端轨迹的曲线等一系列问题,在不与matlab联合仿真的情况下如何使用vrep获得各种曲线?如何调取Graph表格功能中的各种曲线标题?

系统清理软件CCleaner pro mac功能亮点

CCleaner pro for mac是一款mac系统清理软件。CCleaner pro 主要用来清除mac系统不再使用的垃圾文件,以腾出更多硬盘空间。CCleaner pro下载的另一大功能是清除使用者的上网记录。CCleaner的体积小,运行速度极快,可以对临时文件夹、历史记录、…

three.js--立方体

作者:baekpcyyy🐟 使用three.js渲染出可以调节大小的立方体 1.搭建开发环境 1.首先新建文件夹用vsc打开项目终端 2.执行npm init -y 创建配置文件夹 3.执行npm i three0.152 安装three.js依赖 4.执行npm I vite -D 安装 Vite 作为开发依赖 5.根…

IDEA专栏—重装IDEA的配置

文章目录 1、maven路径2、默认文件路径3、插件4、导包顺序5、快捷键6、调整配置插件 1、maven路径 2、默认文件路径 3、插件 4、导包顺序 import static all other imports <blank line> import java.* import javax.* <blank line> import all other imports <…

智慧科研助力科研数据的分析处理

如今&#xff0c;科研领域的发展日新月异&#xff0c;数据量也越来越大。这时&#xff0c;智慧科研可视化技术不仅为科研人员提供了快速高效的数据分析手段&#xff0c;而且为科研工作的推进提供了新的思路和方法。通过可视化手段&#xff0c;我们可以将各种数据、信息、知识以…

TCP 连接断开

1&#xff1a;TCP 四次挥手过程是怎样的&#xff1f; 客户端打算关闭连接&#xff0c;此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文&#xff0c;也即 FIN 报文&#xff0c;之后客户端进入 FIN_WAIT_1 状态。 服务端收到该报文后&#xff0c;就向客户端发送 ACK 应答报文…

JavaEE进阶学习:Bean 作用域和生命周期

1.Bean 作用域 .通过一个案例来看 Bean 作用域的问题 假设现在有一个公共的 Bean&#xff0c;提供给 A 用户和 B 用户使用&#xff0c;然而在使用的途中 A 用户却“悄悄”地修改了公共 Bean 的数据&#xff0c;导致 B 用户在使用时发生了预期之外的逻辑错误。 我们预期的结果…

如何修改.exe文件的修改时间,亲测有效

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 演示视频&#xff1a; 10秒钟实现将文件的修改…

Achronix推出基于FPGA的加速自动语音识别解决方案

提供超低延迟和极低错误率&#xff08;WER&#xff09;的实时流式语音转文本解决方案&#xff0c;可同时运行超过1000个并发语音流 2023年11月——高性能FPGA芯片和嵌入式FPGA&#xff08;eFPGA IP&#xff09;领域的领先企业Achronix半导体公司日前自豪地宣布&#xff1a;正式…

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

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

世微 低功耗 PFM DC-DC 升压芯片 AP8105 干电池手持设备驱动IC

概述 AP8105 系列产品是一种高效率、低纹波、工作频率高的 PFM 升压 DC-DC 变换器。AP8105 系列产品仅需要四个外围元器件&#xff0c;就可完成将低输入的电池电压变换升压到所需的工作电压&#xff0c;非常适合于便携式 1&#xff5e;4 节普通电池应用的场合。电路采用了高性能…

python实现获取aws route53域名信息

最近由于工作原因接触到aws的服务&#xff0c;我需要实时获取所有的域名信息&#xff0c;用于对其进行扫描&#xff0c;因此写了一个自动化爬取脚本 给需要的人分享。 1.基础准备 代码环境&#xff1a;python3 第三方库&#xff1a;boto3 &#xff08;安装方法pip install…

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

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

腾讯云双11活动最后一天,错过再等一年!

腾讯云双11活动已经进入尾声&#xff0c;距离活动结束仅剩最后一天&#xff0c;记得抓住这次上云好时机&#xff0c;错过这次&#xff0c;就要等到下一年才能享受到这样的优惠力度了&#xff01; 活动地址&#xff1a; 点此直达腾讯云双11活动主会场 活动详情&#xff1a; 1…