Oracle优化经典文章------索引原理篇

oracle 基本索引原理 oracle 基本索引原理,oracle 学习真必不可少的资料。 立即下载
导读:
  Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄。这篇文章就将简单的讨论每个索引选项。主要有以下内容:
  [1] 基本的索引概念
  查询DBA_INDEXES视图可得到表中所有索引的列表,注意只能通过USER_INDEXES的方法来检索模式(schema)的索引。访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。
  
  [2] 组合索引
  
  当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。在 Oracle9i引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。比如:表emp有一个组合索引键,该索引包含了empno、ename和deptno。在Oracle9i之前除非在where之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。
  
  特别注意:在Oracle9i之前,只有在使用到索引的前导索引时才可以使用组合索引!
  
  [3] ORACLE ROWID
  
  通过每个行的ROWID,索引Oracle提供了访问单行数据的能力。ROWID其实就是直接指向单独行的线路图。如果想检查重复值或是其他对ROWID本身的引用,可以在任何表中使用和指定rowid列。
  
  [4] 限制索引
  
  限制索引是一些没有经验的开发人员经常犯的错误之一。在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题:
  
   4.1 使用不等于操作符(<>、!=)
  
  下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。
  
  select cust_Id,cust_name
  from  customers
  where cust_rating <> 'aa';
  
  把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。
  
  select cust_Id,cust_name
  from  customers
  where cust_rating <'aa' or cust_rating > 'aa';
  
  特别注意:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。
  
   4.2 使用IS NULL 或IS NOT NULL
  
  使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开   发人员在建表时,把需要索引的列设成NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索   引,关于位图索引在稍后在详细讨论)。
  
   4.3 使用函数
  
  如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
  
  下面的查询不会使用索引(只要它不是基于函数的索引)
  
  select empno,ename,deptno
  from  emp
  where trunc(hiredate)='01-MAY-81';
  
  把上面的语句改成下面的语句,这样就可以通过索引进行查找。
  
  select empno,ename,deptno
  from  emp
  where hiredate<(to_date('01-MAY-81')+0.9999);
  
   4.4 比较不匹配的数据类型
  
  比较不匹配的数据类型也是比较难于发现的性能问题之一。
  
  注意下面查询的例子,account_number是一个VARCHAR2类型,在account_number字段上有索引。下面的语句将执行全表扫描。
  
  select bank_name,address,city,state,zip
  from  banks
  where account_number = 990354;
  Oracle可以自动把where子句变成to_number(account_number)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引:
  select bank_name,address,city,state,zip
  from  banks
  where account_number ='990354';
  
  特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一        次“全表扫描”。
  
  [5] 选择性
  
  使用USER_INDEXES视图,该视图中显示了一个distinct_keys列。比较一下唯一键的数量和表中的行数,就可以判断索引的选择性。选择性越高,索引返回的数据就越少。
  
  [6] 群集因子(Clustering Factor)
  
  Clustering Factor位于USER_INDEXES视图中。该列反映了数据相对于已索引的列是否显得有序。如果Clustering Factor列的值接近于索引中的树叶块(leaf block)的数目,表中的数据就越有序。如果它的值接近于表中的行数,则表中的数据就不是很有序。
  
  [7] 二元高度(Binary height)
  
  索引的二元高度对把ROWID返回给用户进程时所要求的I/O量起到关键作用。在对一个索引进行分析后,可以通过查询DBA_INDEXES的B-level列查看它的二元高度。二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程度而变化。索引上如果有大量被删除的行,它的二元高度也会增加。更新索引列也类似于删除操作,因为它增加了已删除键的数目。重建索引可能会降低二元高度。
  
  [8] 快速全局扫描
  
  在Oracle7.3后就可以使用快速全局扫描(Fast Full Scan)这个选项。这个选项允许Oracle执行一个全局索引扫描操作。快速全局扫描读取B-树索引上所有树叶块。初始化文件中的DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目。
  
  [9] 跳跃式扫描
  
  从Oracle9i开始,索引跳跃式扫描特性可以允许优化器使用组合索引,即便索引的前导列没有出现在WHERE子句中。索引跳跃式扫描比全索引扫描要快的多。下面的程序清单显示出性能的差别:
  
  create index skip1 on emp5(job,empno);
  index created.
  
  select count(*)
  from emp5
  where empno=7900;
  
  Elapsed:00:00:03.13
  
  Execution Plan
  0   SELECT STATEMENT Optimizer=CHOOSE(Cost=4 Card=1 Bytes=5)
  1 0  SORT(AGGREGATE)
  2 1   INDEX(FAST FULL SCAN) OF 'SKIP1'(NON-UNIQUE)
  
  Statistics
  
  6826 consistent gets
  6819 physical  reads
  
  select /*+ index(emp5 skip1)*/ count(*)
  from emp5
  where empno=7900;
  
  Elapsed:00:00:00.56
  
  Execution Plan
  0   SELECT STATEMENT Optimizer=CHOOSE(Cost=6 Card=1 Bytes=5)
  1 0  SORT(AGGREGATE)
  2 1   INDEX(SKIP SCAN) OF 'SKIP1'(NON-UNIQUE)
  
  Statistics
  
  21 consistent gets
  17 physical  reads
  
  [10] 索引的类型
  B-树索引
  位图索引
  HASH索引
  索引编排表
  反转键索引
  基于函数的索引

本文转自
http://oracle.chinaitlab.com/optimize/36880.html  
ORACLE数据库索引工作原理 通过两个图形说明了在oracle数据库中b-tree索引和位图索引的工作原理 立即下载

相关推荐

oracle 索引的原理

oracle 索引的原理原理深入理解!

Oracle ~ 索引种类、创建及管理

Oracle ~ 索引创建及管理1. Oracle 索引简介2. 创建索引2.1 B树索引2.2 位图索引2.3 反向键索引2.4 基于函数的索引3. 修改索引4. 删除索引5. 显示索引信息 1. Oracle 索引简介         在 Oracle 数据库中,存储的每一行数据都有一个 rowID 来标识。当 Oracle 中存储着大量的数据时,意味着有大量的

cai_and_luo的博客 1425

ESP32C3的I2S接口详解:以驱动PCM5102A为例,避开时序与配置的那些坑

本文深入解析ESP32C3的I2S接口驱动PCM5102A DAC的完整解决方案,涵盖时序对齐、PCB优化和寄存器级配置。通过实际案例分享时钟树分析、信号完整性设计和底层调试技巧,帮助开发者避开常见陷阱,实现高质量音频输出。重点探讨了I2S协议栈、电源滤波优化及DMA传输异常处理等关键技术要点。

weixin_30254435的博客 299

Oracle索引详解

Oracle索引一、索引介绍1、什么是索引?2、使用索引的目的二、索引的分类及结构1、逻辑上:2、物理上:三、各种索引详解1、 B树索引(1)特点:(2)技巧:2、位图索引(1)特点:(2)技巧:3、 反向索引(1)特点:(2)技巧:4、HASH索引(1)特点:5、函数索引6、分区索引和全局索引7、域索引 Domain四、怎样建立索引1、普通索引2、唯一索引 Oracle 自动在表的主键上创建唯一索引3、位图索引4、组合索引5、基于函数索引6、反向键索引7.重置索引8.删除索引五、索引失效细节1.使用不等于

D2cOneluo的博客 2万+

【企业微信自建应用-前端篇】企业微信自建应用开发流程详细介绍

最近接到需求,需要我在企业微信端自建一个应用,用来接受PC端派发的工单,告警,公告等内容。这里写一个帖子汇总一下我经历的全流程开发,当然这是基础的流程啊。因为功能要求也不高。后面如果开发更多的东西再补充。

weixin_44265726的博客 9399

Python爬虫实战:全网政府招标信息采集与整合

本文详细介绍了如何使用Python构建一个完整的政府招标信息爬虫系统,涵盖了从数据采集、解析、存储到质量监控的全流程。多源采集:支持多个地方政府网站的同时采集智能解析:自动适应不同网站结构,智能提取关键信息异步高效:使用异步编程提高采集效率反爬应对:内置多种反爬虫应对策略数据质量:完善的数据清洗和质量监控机制易于扩展:模块化设计,便于添加新的数据源。

2201_76125261的博客 1380

create index是否收集统计信息

在oracle10g 后,在create index的时候会收集对象的统计信息,所以compute statistics是为了向后兼容才存在的,在分区的情况下,是否会收集全局的统计信息呢? create table t(n1 number,n2 number) partition by range(n1)( partition p1 values less than (11),partition

敖尔其楞的专栏 993

【25届数字IC秋招总结】面试经验10——紫光同芯

25届数字ic面试记录——紫光同芯

lalala0635的博客 862

Oracle索引详解(索引的原理,创建索引,删除索引,修改索引等)

Oracle索引的介绍,索引的创建,索引的删除和修改等

xinliucs的博客 2万+

结构力学仿真软件:STAAD.Pro:结构抗震设计与STAAD.Pro应用_2024-08-10_11-49-29.Tex

STAAD.Pro是一款广泛应用于结构工程领域的仿真软件,由Bentley Systems开发。它能够进行结构分析和设计,支持多种结构类型,包括桥梁、建筑物、塔架等。STAAD.Pro提供了强大的建模工具,用户可以轻松创建复杂的结构模型,并进行静态和动态分析。软件还支持多种载荷组合,包括地震载荷,以及提供详细的报告和图纸输出,便于工程师进行设计和审查。STAAD.Pro是一款广泛应用于结构工程设计的软件,其界面直观,功能强大,能够进行结构分析与设计。菜单栏。

976

手把手教你学SOME/IP「1.0•概述」

本文介绍了SOME/IP协议的基本概念和主要特点。SOME/IP全称为"Scalable service-Oriented MiddlewarE over IP",是一种面向服务的车载嵌入式通信协议,支持远程过程调用、事件通知等功能。文章指出SOME/IP是AUTOSAR标准的一部分,在车载以太网架构中处于应用层位置,负责服务调度和通信封装。协议具有可扩展性强、资源消耗低、兼容性好等优势,能满足汽车电子领域对实时性、可靠性的严格要求。同时,文章也说明了SOME/IP的正确书写规范,并解释

nihaoljq2010的博客 678

oracle索引原理

一、索引原理     Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄。这篇文章就将简单的讨论每个索引选项。主要有以下内容: [1] 基本的索引概念

蓦然回首,择城终老 6115

【AI应用实战-OpenCode】OpenCode安装部署(一)

OpenCode是一款2026年流行的开源AI编程工具,兼具轻量代码编辑器和智能编码代理功能。其核心优势包括:完全免费开源(MIT协议)、全平台兼容、支持75+大模型(含本地部署)、内置完整编程功能链(代码补全/Git集成/AI调试等),且所有数据本地存储确保隐私安全。相比Copilot等商业工具,OpenCode提供更自由的模型选择和零门槛使用体验。安装要求Windows10+/macOS12+/Linux主流发行版,仅需200MB空间和4G内存。该工具完美兼容VSCode生态,支持终端/桌面/IDE三种

2425

Oracle优化经典文章--索引原理篇

Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄。这篇文章就将简单的讨论每个索引选项。主要有以下内容: [1] 基本的索引概念 查询DBA_INDEXES

285

2026.2.23:AgentScope框架实战<一>:安装并使用agentscope

本文介绍了AgentScope框架的安装与使用实践。通过PyPI安装agentscope[full]后,演示了如何创建ReActAgent代理:1)配置DashScope聊天模型;2)注册自定义工具函数(查询位置和天气);3)初始化代理并处理用户请求。示例展示了代理如何响应复合查询(如同时获取北京位置和天气信息),输出结果显示代理成功执行了工具调用并返回结构化响应。该框架支持Python 3.13环境,提供内存管理、工具集成等功能,适用于构建智能代理系统。

拥抱具身智能,昇腾Ascend C 505

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

oracle优先站点的原理_Oracle优化经典文章------索引原理篇

Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄。这篇文章就将简单的讨论每个索引选项。主要有以下内容:[1] 基本的索引概念查询DBA_INDEXES视图可得到表...

weixin_39609670的博客 106

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: ORACLE索引与高性能SQL介绍
下一篇: java正则表达式详解
superjava_2006
博客等级 码龄20年 39粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值