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索引知识看这一篇就足够
🏆 文章目标:本篇介绍Oracle索引知识以及案例场景 🍀 Oracle索引知识看这一篇就足够 ✅ 创作者:Jay… 🎉 个人主页:Jay的个人主页 🍁 展望:若本篇讲解内容帮助到您,请帮忙…...
kafka命令行操作
新老版本kafka命令行操作 啓動Kafka: 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)
参考链接:https://juejin.cn/post/7121209657678364685 Pinia官方: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日,周五晚上: 今天晚上突然想写一个运行在命令行上的文本编辑器,因为平时写文本时老是要创建新的文本文件,觉得太麻烦了。捣鼓了一个晚上,才选出一个我觉得比较满意的。我把这个程序添加到了系统环境变量中…...

人工智能的界面革命,消费者与企业互动的方式即将发生变化。
本文来源于 digitalnative.substack.com/p/ais-interface-revolution 描述了一种社会现象: 随着真实友谊的减少和虚拟友谊的增加,越来越多的人开始将AI聊天机器人视为自己的朋友,甚至建立了深厚的情感纽带。这可能与当前人们越来越孤独的现实…...

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

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

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

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

【SpringCloud组件——Eureka】
前置准备: 分别提供订单系统(OrderService)和用户系统(UserService)。订单系统主要负责订单相关信息的处理,用户系统主要负责用户相关信息的处理。 一、微服务当中的提供者和消费者 1.1、概念 服务提供…...

JVM面试题(一)
JVM内存分哪几个区,每个区的作用是什么? java虚拟机主要分为以下几个区: JVM中方法区和堆空间是线程共享的,而虚拟机栈、本地方法栈、程序计数器是线程独享的。 (1)方法区: a. 有时候也成为永久代,在该区内…...
c# 无损压缩照片大小,并且设计了界面,添加了外部Ookii.Dialogs.dll,不一样的选择文件夹界面,并且可以把外部dll打包进exe中
c# 无损压缩照片大小,并且设计了界面,添加了外部Ookii.Dialogs.dll,不一样的选择文件夹界面,并且可以把外部dll打包进exe中 using System; using System.Collections; using System.Collections.Generic; using System.ComponentM…...

《统计学习方法》——隐马尔可夫模型(上)
引言 这是《统计学习方法》第二版的读书笔记,由于包含书上所有公式的推导和大量的图示,因此文章较长,正文分成三篇,以及课后习题解答,在习题解答中用Numpy实现了维特比算法和前向后向算法。 《统计学习方法》——隐马…...
ElasticSearch删除索引【真实案例】
文章目录 背景分析解决遇到的问题 - 删除超时报错信息解决办法1:调大超时时间解决办法2:调大ES堆内存参考背景 项目中使用了ELK技术栈实现了日志管理,但是日志管理功能目前并没有在生产上实际使用。 但ELK程序依然在运行,导致系统磁盘发生告警,剩余可用磁盘不足10%。 所以…...

基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集设计(三)连续多段触发存储及传输逻辑设计
本章将完成数据速率为 80MHz 、位宽为 12bits 的 80 路并行采样数据的连续多 段触发存储。首先,给出数据触发存储的整体框架及功能模块划分。然后,简介 MIG 用户接口、设置及读写时序。最后,进行数据跨时钟域模块设计,内存…...
对 Iterator, Generator 的理解?
Iterator Iterator是最简单最好理解的。 简单的说,我们常用的 for of 循环,都是通过调用被循环对象的一个特殊函数 Iterator 来实现的,但是以前这个函数是隐藏的我们无法访问, 从 Symbol 引入之后,我们就可以通过 Sy…...

C++基础
文章目录 C命名空间定义命名空间using指令不连续的命名空间嵌套的命名空间 面向对象类类成员的访问权限及类的封装对象类成员函数类访问修饰符构造函数和析构函数类的构造函数带参数的构造函数使用初始化列表来初始化字段类的析构函数拷贝构造函数 友元函数内联函数this指针指向…...
软件测试全流程
软件测试全流程 一、制定测试策略二、制定测试方案三、编辑测试用例四、执行测试用例五、输出问题单六、回归测试七、测试文件归档 一、制定测试策略 1、测试目的测试范围 2、用什么测试方法工具(例如功能测试用黑盒测试) 3、测试优先级(功能…...

【软件测试】支付模块测试攻略,这些测试方法和注意事项你掌握了么?
对于大部分人而言,支付模块或许是日常生活中最为关注和使用的功能之一,因此,对于支付模块的质量控制也显得尤为重要。 但考虑到支付涉及到金钱流转等敏感信息,一旦出现问题可能带来非常严重后果。因此,在支付模块测试…...

刷完这个笔记,17K不能再少了....
大家好,最近有不少小伙伴在后台留言,得准备面试了,又不知道从何下手!为了帮大家节约时间,特意准备了一份面试相关的资料,内容非常的全面,真的可以好好补一补,希望大家在都能拿到理想…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...