知识大全 Oracle索引原理

Posted 索引

篇首语:得意犹堪夸世俗,诏黄新湿字如鸦。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Oracle索引原理相关的知识,希望对你有一定的参考价值。

Oracle索引原理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

  [ ] 基本的索引概念

  查询DBA_INDEXES视图可得到表中所有索引的列表 注意只能通过USER_INDEXES的方法来检索模式(schema)的索引 访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列

  [ ] 组合索引

  当某个索引包含有多个已索引的列时 称这个索引为组合(concatented)索引 在 Oracle i引入跳跃式扫描的索引访问方法之前 查询只能在有限条件下使用该索引 比如 表emp有一个组合索引键 该索引包含了empno ename和deptno 在Oracle i之前除非在where之句中对第一列(empno)指定一个值 否则就不能使用这个索引键进行一次范围扫描

  特别注意 在Oracle i之前 只有在使用到索引的前导索引时才可以使用组合索引!

  [ ] ORACLE ROWID

  通过每个行的ROWID 索引Oracle提供了访问单行数据的能力 ROWID其实就是直接指向单独行的线路图 如果想检查重复值或是其他对ROWID本身的引用 可以在任何表中使用和指定rowid列

  [ ] 限制索引

  限制索引是一些没有经验的开发人员经常犯的错误之一 在SQL中有很多陷阱会使一些索引无法使用 下面讨论一些常见的问题

   使用不等于操作符(<> !=)        下面的查询即使在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条件 就可以使用索引 以避免全表扫描

   使用IS NULL 或IS NOT NULL

  使用IS NULL 或IS NOT NULL同样会限制索引的使用 因为NULL值并没有被定义 在SQL语句中使用NULL会有很多的麻烦 因此建议开发人员在建表时 把需要索引的列设成 NOT NULL 如果被索引的列在某些行中存在NULL值 就不会使用这个索引(除非索引是一个位图索引 关于位图索引在稍后在详细讨论)

   使用函数

  如果不使用基于函数的索引 那么在SQL语句的WHERE子句中对存在索引的列使用函数时 会使优化器忽略掉这些索引 下面的查询不会使用索引(只要它不是基于函数的索引)

  select empno ename deptno          from   emp          where  trunc(hiredate)= MAY ;          把上面的语句改成下面的语句 这样就可以通过索引进行查找           select empno ename deptno          from   emp          where  hiredate<(to_date( MAY )+ );     比较不匹配的数据类型         比较不匹配的数据类型也是比较难于发现的性能问题之一          注意下面查询的例子 account_number是一个VARCHAR 类型          在account_number字段上有索引 下面的语句将执行全表扫描          select bank_name address city state zip         from   banks         where  account_number = ;         Oracle可以自动把where子句变成to_number(account_number)= 这样就限制了          索引的使用 改成下面的查询就可以使用索引          select bank_name address city state zip         from   banks         where  account_number = ;     特别注意 不匹配的数据类型之间比较会让Oracle自动限制索引的使用         即便对这个查询执行Explain Plan也不能让您明白为什么做了一次 全表扫描

  [ ] 选择性

  使用USER_INDEXES视图 该视图中显示了一个distinct_keys列 比较一下唯一键的数量和表中的行数 就可以判断索引的选择性 选择性越高 索引返回的数据就越少

  [ ] 群集因子(Clustering Factor)

  Clustering Factor位于USER_INDEXES视图中 该列反映了数据相对于已索引的列是否显得有序 如果Clustering Factor列的值接近于索引中的树叶块(leaf block)的数目 表中的数据就越有序 如果它的值接近于表中的行数 则表中的数据就不是很有序

  [ ] 二元高度(Binary height)

  索引的二元高度对把ROWID返回给用户进程时所要求的I/O量起到关键作用 在对一个索引进行分析后 可以通过查询DBA_INDEXES的B level列查看它的二元高度 二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程度而变化 索引上如果有大量被删除的行 它的二元高度也会增加 更新索引列也类似于删除操作 因为它增加了已删除键的数目 重建索引可能会降低二元高度

  [ ] 快速全局扫描

  在 Oracle 后就可以使用快速全局扫描(Fast Full Scan)这个选项 这个选项允许Oracle执行一个全局索引扫描操作 快速全局扫描读取B 树索引上所有树叶块 初始化文件中的 DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目

  [ ] 跳跃式扫描

  从Oracle i开始 索引跳跃式扫描特性可以允许优化器使用组合索引 即便索引的前导列没有出现在WHERE子句中 索引跳跃式扫描比全索引扫描要快的多 下面的程序清单显示出性能的差别

cha138/Article/program/Oracle/201311/17421

相关参考

知识大全 ORACLE索引提高效率

ORACLE索引提高效率  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  用索引提高效率  索引是

知识大全 Oracle 的位图索引

Oracle的位图索引  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle的索引主要包含

知识大全 Oracle监控索引怎么使用

Oracle监控索引怎么使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle监控索引

知识大全 Oracle在线索引重构

Oracle在线索引重构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  查询某个表的索引属于哪个

知识大全 oracle数据库如何重建索引

  当索引的碎片过多时会影响执行查询的速度从而影响到我们的工作效率这时候采取的最有利的措施莫过于重建索引了本文主要介绍了Oracle数据库中检查索引碎片并重建索引的过程接下来我们就开始介绍这一过程  

知识大全 Oracle索引(index)简单介绍

Oracle索引(index)简单介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  索引分类 

知识大全 Oracle索引的内部结构

Oracle索引的内部结构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle使用平衡树

知识大全 oracle修改索引现有表空间

  //dba_indexes可查询所有索引以及索引部分信息可以灵活运用于其他用途  //假设用户USER现有表空间TSTS需要迁移其下所有表空间TS的索引到TS中可使用以下语句(在plsql中)  

知识大全 ORACLE的索引和约束详解

ORACLE的索引和约束详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle的约束*

知识大全 Oracle的索引类型

Oracle的索引类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近在写一篇关于oracl