当前位置: 首页 > news >正文

Oracle索引知识看这一篇就足够

🏆 文章目标:本篇介绍Oracle索引知识以及案例场景
🍀 Oracle索引知识看这一篇就足够
✅ 创作者:Jay…
🎉 个人主页:Jay的个人主页
🍁 展望:若本篇讲解内容帮助到您,请帮忙点个赞吧,再点点您的小手关注下,您的支持是我继续写作的最大动力,谢谢🙏 作为回馈,对我博客内容感兴趣的小伙伴可以私聊我,我们一起学习 Oracle 和 PostgreSQL的知识,大家一起共同进步。

什么是索引

Oracle 索引是数据库中用于加快数据访问速度的一种结构。当对某个字段进行查询时,如果该字段有索引,数据库就可以直接查找到数据的位置,而无需扫描整个表。这就像在书中查找某个特定的词,如果书中有索引,你就可以直接翻到该词的页面,而无需一页一页地查找。

索引的分类

以下介绍的索引适用版本: Oracle 8i, 9i, 10g, 11g, 12c, 18c和19c等。

Oracle 提供了多种类型的索引,包括:

B-Tree 索引

B-Tree(平衡多路查找树)索引是Oracle数据库中最常用的索引类型。B-Tree索引对于高选择性的查询非常有效,这意味着查询返回的结果集占总行数的一小部分。这种索引类型也支持对索引键进行排序和范围搜索。

CREATE INDEX emp_last_name_idx ON employees (last_name);

此案例中,我们创建了一个名为emp_last_name_idx的B-Tree索引,该索引基于employees表的last_name列。

Bitmap 索引

Bitmap索引使用一种称为位图的数据结构,每个位表示一个行的存在或不存在。Bitmap索引非常适合低选择性的数据,即查询返回的结果集占总行数的很大一部分。另外,Bitmap索引在数据仓库环境中很常用,因为它可以高效地处理多个Bitmap索引之间的AND和OR操作。

CREATE BITMAP INDEX emp_gender_bidx ON employees (gender);

在此案例中,我们创建了一个名为emp_gender_bidx的Bitmap索引,该索引基于employees表的gender列。

Partitioned 索引

Partitioned索引是与表分区配合使用的。表分区可以按不同的方式划分数据,同样,索引也可以按相同或不同的方式进行分区。每个分区索引对应一个表分区。分区索引可以是B-Tree索引或Bitmap索引。

CREATE INDEX sales_date_idx ON sales (sale_date)LOCAL (PARTITION sales_q1 VALUES LESS THAN (TO_DATE('01-APR-2022','DD-MON-YYYY')),PARTITION sales_q2 VALUES LESS THAN (TO_DATE('01-JUL-2022','DD-MON-YYYY')),PARTITION sales_q3 VALUES LESS THAN (TO_DATE('01-OCT-2022','DD-MON-YYYY')),PARTITION sales_q4 VALUES LESS THAN (TO_DATE('01-JAN-2023','DD-MON-YYYY')));

在此案例中,我们创建了一个名为sales_date_idx的分区索引,该索引基于sales表的sale_date列,索引按照日期范围进行了分区。

Function-Based 索引

Function-Based索引是在某个函数的结果上建立的。这个函数可以是内置函数(例如,UPPER, LOWER)或用户定义函数。Function-Based索引对于处理复杂查询和改善特定类型的查询性能非常有用。

CREATE INDEX emp_name_upper_idx ON employees (UPPER(last_name));

在此案例中,我们创建了一个名为emp_name_upper_idx的函数索引,该索引基于employees表的last_name列的大写形式。

Reverse Key 索引

Reverse Key索引和B-Tree索引类似,只不过它将索引键的字节反转。这种索引类型主要用于减少索引键插入的热点,适用于有大量插入操作的索引。

CREATE INDEX emp_id_reverse_idx ON employees (employee_id) REVERSE;

在此案例中,我们创建了一个名为emp_id_reverse_idx的反向键索引,该索引基于employees表的employee_id列。

Text 索引

Text索引用于全文搜索,可以搜索包含某个词或短语的文档。

首先,需要创建一个文本首选项并设置其属性:

BEGINCTX_DDL.CREATE_PREFERENCE('my_preference', 'BASIC_WORDLIST');CTX_DDL.SET_ATTRIBUTE('my_preference', 'STEM_FUZZY', 'ENGLISH');
END;

然后,可以创建文本索引:

CREATE INDEX docs_text_idx ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('WORDLIST my_preference');

在此案例中,我们创建了一个名为docs_text_idx的文本索引,该索引基于docs表的text列。

Spatial 索引

Spatial索引用于空间数据,可以搜索在某个地理区域内的数据。

在创建空间索引之前,首先需要在表上添加一个空间列:

ALTER TABLE geo_data ADD (shape SDO_GEOMETRY);

然后,可以创建空间索引:

CREATE INDEX geo_shape_sidx ON geo_data(shape) INDEXTYPE IS MDSYS.SPATIAL_INDEX;

在此案例中,我们创建了一个名为geo_shape_sidx的空间索引,该索引基于geo_data表的shape列。

每种索引类型都有其特定的优点和使用场景,你可以根据实际需求选择合适的索引类型.

常见的索引优化案例

正面案例

假设你有一个员工表,表中包含数百万条记录。如果你需要根据员工的姓氏查询数据,没有索引的情况下,Oracle 需要对整个表进行全表扫描,这可能需要花费很长的时间。如果你在姓氏字段上创建了索引,查询操作可以直接在索引中查找相应的数据,大大减少了查询时间。

CREATE INDEX idx_lastname ON employees (lastname);

然后你可以执行以下查询,它将利用你刚刚创建的索引:

SELECT * FROM employees WHERE lastname = 'Smith';

反面案例

假设你有一个订单表,该表的每一行都有一个状态字段,该字段表示订单的状态(如“新订单”,“处理中”,“已完成”)。如果你在此状态字段上创建了索引,可能并不能获得你预期的性能提升。

CREATE INDEX idx_status ON orders (status);

如果大部分的订单都处于“已完成”的状态,那么查询所有“已完成”的订单可能会返回表中的大部分行。在这种情况下,数据库可能决定进行全表扫描,而不是使用索引,因为全表扫描可能比查找并返回索引中的大部分行更有效。

SELECT * FROM orders WHERE status = '已完成';

因此,当你考虑在某个字段上创建索引时,需要考虑该字段的数据分布。在有大量重复值的字段上创建索引可能不会带来预期的性能提升。

索引失效的案例

有时间明明已经建立了索引,缺无法生效,那时为什么呢?这时候需要考虑是否索引失效了,如下场景介绍了失效的几种案例:

1、使用了函数或表达式:在这个例子中,我们用到了UPPER函数。索引可能不会被使用:

SELECT * FROM employees WHERE UPPER(last_name) = 'SMITH';

在这个情况下,你可能需要创建一个function-based index来优化这个查询。

2、使用了不等运算符:在这个例子中,我们用到了不等运算符,所以索引可能不会被使用:

SELECT * FROM employees WHERE salary <> 5000;

3、使用了OR运算符:在这个例子中,我们用到了OR运算符。尽管department_id和job_id列都有索引,但是在这种情况下,Oracle可能无法有效地利用它们:

SELECT * FROM employees WHERE department_id = 10 OR job_id = 'SA_REP';

4、NULL值:Oracle在索引中不存储NULL值。因此,在这个例子中,尽管last_name列有索引,但是如果我们搜索NULL值,索引可能不会被使用:

SELECT * FROM employees WHERE last_name IS NULL;

5、使用了不等运算符:当在查询中使用不等号运算符时,Oracle可能无法使用索引。例如:

SELECT * FROM employees WHERE salary <> 5000;

在此查询中,Oracle无法使用salary的索引(如果存在的话),因为不等运算符无法有效利用B-tree索引。

6、使用了OR运算符:在WHERE子句中使用OR运算符可能会使索引失效,尤其是当OR运算符连接的列都有各自的索引时。例如:

SELECT * FROM employees WHERE department_id = 10 OR job_id = 'SA_REP';

在此查询中,即使department_id和job_id列都有索引,Oracle也可能无法有效地利用它们。

7、数据分布不均:如果索引列的数据分布非常不均匀,那么对于某些查询,Oracle可能会选择全表扫描而不是使用索引。

8、统计信息过时或不准确:Oracle优化器依赖于准确的统计信息来制定最有效的执行计划。如果统计信息过时或不准确,Oracle可能不会选择最佳的执行计划,这可能包括不正确的索引选择。

这些都是索引可能失效的原因,如果在执行计划中发现索引未被使用,可以检查上述情况是否存在。如果存在,可以通过调整查询、改变数据分布或更新统计信息等方式来优化。

索引的最佳实践

  • 创建索引前要充分理解业务需求:理解你的查询工作负载是至关重要的,因为它将决定哪些列需要被索引,以及应该使用哪种类型的索引。
  • 避免过度索引:虽然索引可以加速查询,但每个额外的索引都会消耗磁盘空间,并在插入、更新和删除操作时带来额外的开销。因此,你应该避免对不需要的列创建索引。
  • 定期维护和重建索引:索引会随着时间的推移而变得碎片化,可能需要定期重建。你可以使用 Oracle 的 ANALYZE INDEX 命令或 DBMS_STATS 包来收集索引的统计信息,并确定是否需要重建索引。

相关文章:

Oracle索引知识看这一篇就足够

&#x1f3c6; 文章目标&#xff1a;本篇介绍Oracle索引知识以及案例场景 &#x1f340; Oracle索引知识看这一篇就足够 ✅ 创作者&#xff1a;Jay… &#x1f389; 个人主页&#xff1a;Jay的个人主页 &#x1f341; 展望&#xff1a;若本篇讲解内容帮助到您&#xff0c;请帮忙…...

kafka命令行操作

新老版本kafka命令行操作 啓動Kafka&#xff1a; kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties Kafka命令行操作 查看当前集群中已存在的主题topic 旧的方式 kafka-topics.sh --zookeeper bdphdp01:2181 --list kafka-topics.sh --zookeeper bdphd…...

Pinia 上手使用(store、state、getters、actions)

参考链接&#xff1a;https://juejin.cn/post/7121209657678364685 Pinia官方&#xff1a;https://pinia.vuejs.org/zh/introduction.html 一、安装 npm i pinia -S二、main.js 引入 import { createApp } from "vue" import App from "./App.vue" impor…...

C++小项目之文本编辑器mynote(1.0.0版本)

2023年5月19日&#xff0c;周五晚上&#xff1a; 今天晚上突然想写一个运行在命令行上的文本编辑器&#xff0c;因为平时写文本时老是要创建新的文本文件&#xff0c;觉得太麻烦了。捣鼓了一个晚上&#xff0c;才选出一个我觉得比较满意的。我把这个程序添加到了系统环境变量中…...

人工智能的界面革命,消费者与企业互动的方式即将发生变化。

本文来源于 digitalnative.substack.com/p/ais-interface-revolution 描述了一种社会现象&#xff1a; 随着真实友谊的减少和虚拟友谊的增加&#xff0c;越来越多的人开始将AI聊天机器人视为自己的朋友&#xff0c;甚至建立了深厚的情感纽带。这可能与当前人们越来越孤独的现实…...

深度学习课程:手写体识别示例代码和详细注释

Pytorch 的快速入门&#xff0c;参见 通过两个神经元的极简模型&#xff0c;清晰透视 Pytorch 工作原理。本文结合手写体识别项目&#xff0c;给出一个具体示例和直接关联代码的解释。 1. 代码 下面代码展示了完整的手写体识别的 Python 程序代码。代码中有少量注释。在本文后…...

10-03 单元化架构设计

设计原则 透明 对开发者透明 在做实现时&#xff0c;不依赖于单元划分和部署对组件透明 在组件运行时&#xff0c;不感知其承载单元对数据透明 数据库并不知道为哪个单元提供服务 业务可分片 系统业务复杂度足够高系统可以按照某一维度进行切分系统数据必须可以被区分 业务…...

JAVA—实验3 继承与多态

一、实验目的 1.掌握类的继承机制 2.掌握抽象类的定义方法 2.熟悉类中成员变量和方法的访问控制 3.熟悉成员方法或构造方法的多态性 二、实验内容 1. Circle类及其子类 【问题描述】 实现类Circle&#xff0c;半径为整型私有数据成员 1&#xff09;构造方法&#xff1a;参数为…...

TCP协议和相关特性

1.TCP协议的报文结构 TCP的全称为&#xff1a;Transmission Control Protocol。 特点: 有连接可靠传输面向字节流全双工 下面是TCP的报文结构&#xff1a; 源端口和目的端口&#xff1a; 源端口表示数据从哪个端口传输出来&#xff0c;目的端口表示数据传输到哪个端口去。…...

【SpringCloud组件——Eureka】

前置准备&#xff1a; 分别提供订单系统&#xff08;OrderService&#xff09;和用户系统&#xff08;UserService&#xff09;。订单系统主要负责订单相关信息的处理&#xff0c;用户系统主要负责用户相关信息的处理。 一、微服务当中的提供者和消费者 1.1、概念 服务提供…...

JVM面试题(一)

JVM内存分哪几个区&#xff0c;每个区的作用是什么? java虚拟机主要分为以下几个区: JVM中方法区和堆空间是线程共享的&#xff0c;而虚拟机栈、本地方法栈、程序计数器是线程独享的。 &#xff08;1&#xff09;方法区&#xff1a; a. 有时候也成为永久代&#xff0c;在该区内…...

c# 无损压缩照片大小,并且设计了界面,添加了外部Ookii.Dialogs.dll,不一样的选择文件夹界面,并且可以把外部dll打包进exe中

c# 无损压缩照片大小&#xff0c;并且设计了界面&#xff0c;添加了外部Ookii.Dialogs.dll&#xff0c;不一样的选择文件夹界面&#xff0c;并且可以把外部dll打包进exe中 using System; using System.Collections; using System.Collections.Generic; using System.ComponentM…...

《统计学习方法》——隐马尔可夫模型(上)

引言 这是《统计学习方法》第二版的读书笔记&#xff0c;由于包含书上所有公式的推导和大量的图示&#xff0c;因此文章较长&#xff0c;正文分成三篇&#xff0c;以及课后习题解答&#xff0c;在习题解答中用Numpy实现了维特比算法和前向后向算法。 《统计学习方法》——隐马…...

ElasticSearch删除索引【真实案例】

文章目录 背景分析解决遇到的问题 - 删除超时报错信息解决办法1:调大超时时间解决办法2:调大ES堆内存参考背景 项目中使用了ELK技术栈实现了日志管理,但是日志管理功能目前并没有在生产上实际使用。 但ELK程序依然在运行,导致系统磁盘发生告警,剩余可用磁盘不足10%。 所以…...

基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集设计(三)连续多段触发存储及传输逻辑设计

本章将完成数据速率为 80MHz 、位宽为 12bits 的 80 路并行采样数据的连续多 段触发存储。首先&#xff0c;给出数据触发存储的整体框架及功能模块划分。然后&#xff0c;简介 MIG 用户接口、设置及读写时序。最后&#xff0c;进行数据跨时钟域模块设计&#xff0c;内存…...

对 Iterator, Generator 的理解?

Iterator Iterator是最简单最好理解的。 简单的说&#xff0c;我们常用的 for of 循环&#xff0c;都是通过调用被循环对象的一个特殊函数 Iterator 来实现的&#xff0c;但是以前这个函数是隐藏的我们无法访问&#xff0c; 从 Symbol 引入之后&#xff0c;我们就可以通过 Sy…...

C++基础

文章目录 C命名空间定义命名空间using指令不连续的命名空间嵌套的命名空间 面向对象类类成员的访问权限及类的封装对象类成员函数类访问修饰符构造函数和析构函数类的构造函数带参数的构造函数使用初始化列表来初始化字段类的析构函数拷贝构造函数 友元函数内联函数this指针指向…...

软件测试全流程

软件测试全流程 一、制定测试策略二、制定测试方案三、编辑测试用例四、执行测试用例五、输出问题单六、回归测试七、测试文件归档 一、制定测试策略 1、测试目的测试范围 2、用什么测试方法工具&#xff08;例如功能测试用黑盒测试&#xff09; 3、测试优先级&#xff08;功能…...

【软件测试】支付模块测试攻略,这些测试方法和注意事项你掌握了么?

对于大部分人而言&#xff0c;支付模块或许是日常生活中最为关注和使用的功能之一&#xff0c;因此&#xff0c;对于支付模块的质量控制也显得尤为重要。 但考虑到支付涉及到金钱流转等敏感信息&#xff0c;一旦出现问题可能带来非常严重后果。因此&#xff0c;在支付模块测试…...

刷完这个笔记,17K不能再少了....

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到理想…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...