Oracle索引详解(二)

--索引分类

  Oracle 提供了大量索引选项。知道在给定条件下使用哪个选项对于一个程序的性能来说非常重要。一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,极大的提高数据操作语句的运行效率。

 导读【2017-12-26】【22:35:36】

    • B 树索引(默认类型)
    • 位图索引
    • HASH 索引
    • 索引组织表索引
    • 反转键(reverse key)索引
    • 基于函数的索引
    • 分区索引(本地和全局索引)
    • 位图连接索引

一、B 树索引

  B 树索引在 Oracle 中是一个通用索引。在创建索引时它就是默认的索引类型。B 树索 引可以是一个列的(简单)索引,也可以是组合/复合(多个列)的索引。B 树索引最多可以包括 32 列。 索引列的值都存储在索引中。因此,可以建立一个组合(复合)索引,这些索引可以直 接满足查询,而不用访问表。这就不用从表中检索数据,从而减少了 I/O 量。

特点:

  1. 适合与大量的增、删、改(OLTP);
  2. 不能用包含 OR 操作符的查询;
  3. 适合高基数的列(唯一值多);
  4. 典型的树状结构;
  5. 每个结点都是数据块;
    大多都是物理上一层、两层或三层不定,逻辑上三层;
  6. 叶子块数据是排序的,从左向右递增;
  7. 在分支块和根块中放的是索引的范围;

二、位图索引

  位图索引非常适合于决策支持系统(Decision Support System,DSS)和数据仓库,它们不应该用于通过事务处理应用程序访问的表。它们可以使用较少到中等 基数(不同值的数量)的列访问非常大的表。尽管位图索引最多可达 30 个列,但通常它们都只用于少量的列。对于有较低基数的列需要使用位图索引,比如性别。 在一个查询中合并多个位图索引后,可以使性能显著提高。位图索引 使用固定长度的数据类型要比可变长度的数据类型好。较大尺寸的块也会提高对 位图索引的存储和读取性能。

特点:

  1. 适合与决策支持系统;
  2. 做 UPDATE 代价非常高;
  3. 非常适合 OR 操作符的查询;
  4. 基数比较少的时候才能建位图索引;

三、HASH 索引

  使用 HASH 索引必须要使用 HASH 集群。建立一个集群或 HASH 集群的同 时,也就定义了一个集群键。这个键告诉 Oracle 如何在集群上存储表。在存储数据时,所有与这个集群键相关的行都被存储在一个数据库块上。 HASH 索引在有限制条件(需要指定一个确定的值而不是一个值范围)的情况下非常有用。

特点:

  1. HASH 索引可能是访问数据库中数据的最快方法,但它也有自身的缺点,低估了集群键的不同值的数字可能会造成集群的冲突 ;
  2. 如果不能为集群的未来增长分配好附加的空间,HASH 集群可能就不 是最好的选择;
  3. 如果应用程序经常在集群表上进行全表扫描,HASH 集群可能也 不是最好的选择;
  4. 通常,HASH 对于一些包含 有序值的静态数据非常有效;

四、索引组织表

  索引组织表会把表的存储结构改成 B 树结构,以表的主键进行排序。这种特殊的表和其他类型的表一样,可以在表上执行所有的 DML 和 DDL 语句。由于表的特殊结构,ROWID 并没有被关联到表的行上。

  对于一些涉及精确匹配和范围搜索的语句,索引组织表提供了一种基于键的快速数据访问机制。基于主键值的 UPDATE 和 DELETE 语句的性能也同样得以提高,这是因为行在物理上有序。由于键列的值在表和索引中都没有重复,存储所需要的空间也随之减少。

  如果不会频繁地根据主键列查询数据,则需要在索引组织表中的其他列上创建二级索引。不会频繁根据主键查询表的应用程序不会了解到使用索引组织表的全部优点。对于总是通过对主键的精确匹配或范围扫描进行访问的表,就需要考虑使用索引组织表,可以在索引组织表上建立二级索引

五、反转键索引

  当载入一些有序数据时,索引肯定会碰到与 I/O 相关的一些瓶颈。在数据载 入期间,某部分索引和磁盘肯定会比其他部分使用频繁得多。为了解决这个问题, 可以把索引表空间存放在能够把文件物理分割在多个磁盘上的磁盘体系结构上。

  为了解决这个问题,Oracle 还提供了一种反转键索引的方法。如果数据以反转键索引存储,这些数据的值就会与原先存储的数值相反。这样,数据 1234、1235 和 1236 就被存储成 4321、5321 和 6321。结果就是索引会为每次新插入 的行更新不同的索引块。

技巧:

  1. 如果您的磁盘容量有限,同时还要执行大量的有序载入,就可以使用反转键索引。
  2. 不可以将反转键索引与位图索引或索引组织表结合使用。因为不能对位图索引和索引组织表进行反转键处理。

六、基于函数的索引

  可以在表中创建基于函数的索引。如果没有基于函数的索引,任何在列上执行了函数的查询都不能使用这个列的索引。例如,下面的查询就不能使用 JOB 列上的索引,除非它是基于函数的索引:

    select * from emp where UPPER(job) = 'MGR';

  下面的查询使用 JOB 列上的索引,但是它将不会返回 JOB 列具有 Mgr 或 mgr 值的行:

   select * from emp where job = 'MGR';

  可以创建这样的索引,允许索引访问支持基于函数的列或数据。可以对列表 达式 UPPER(job)创建索引,而不是直接在 JOB 列上建立索引,如:

    create index EMP$UPPER_JOB on emp(UPPER(job));

尽管基于函数的索引非常有用,但在建立它们之前必须先考虑下面一些问题:

  1. 能限制在这个列上使用的函数吗?如果能,能限制所有在这个列上执行的所有函数吗?
  2. 是否有足够应付额外索引的存储空间?
  3. 在每列上增加的索引数量会对针对该表执行的 DML 语句的性能带来何种影响?

  基于函数的索引非常有用,但在实现时必须小心。在表上创建的索引越多,INSERT、UPDATE 和 DELETE 语句的执行就会花费越多的时间。 注意:对于优化器所使用的基于函数的索引来说,必须把初始参数 QUERY_REWRITE _ ENABLED 设定为 TRUE。

  示例:

 select count(*) from sample where ratio(balance,limit) >.5;
time: 20.1 minutes create index ratio_idx1 on sample (ratio(balance, limit)); select count(*) from sample where ratio(balance,limit) >.5;
time: 7 seconds

Oracle索引详解的更多相关文章

  1. 【转载】oracle索引详解2

    原文URL:http://justplayoop1.iteye.com/blog/1259562 一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDE ...

  2. 【转载】oracle索引详解

    原文URL;http://www.oschina.net/question/30362_4057?fromerr=FiY27yLL 作者:crazyinsomnia 一. ROWID的概念 存储了ro ...

  3. Oracle 索引 详解

    转载:http://www.2cto.com/database/201110/107271.html 一.索引介绍 1.1 索引的创建语法: CREATE UNIUQE | BITMAP INDEX ...

  4. Oracle索引 详解

    作者:Dave 一.索引介绍 1.1 索引的创建语法: CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <sc ...

  5. Oracle数据字典详解

    学习笔记:oracle数据字典详解 --- 本文为TTT学习笔记,首先介绍数据字典及查看方法,然后分类总结各类数据字典的表和视图.然后列出一些附例.   数据字典系统表,保存在system表空间中. ...

  6. oracle rowid 详解

    oracle rowid详解 今天是2013-09-15,存储在数据库中的每一行数据都有一个地址,oracle使用rowid数据类型在存储地址.rowid有如下类别: 1)physical rowid ...

  7. MySQL 联合索引详解

    MySQL 联合索引详解   联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c ...

  8. oracle 数据类型详解---日期型(转载)

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...

  9. oracle 序列 详解

    序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l  自动提供唯一的数值 l  共享对象 l  主要用于提供主键值 l  将序列值装入内存可以提高访问效率 创建序列: 1.  要有创建 ...

随机推荐

  1. 手写particles

    var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); var Grewer = { in ...

  2. MyBatis《2》

    MyBatis入参考文档:http://mybatis.org/mybatis-3/zh/   1.properties 属性 1.在MyBatis配置文件中引用属性文件     MyBatis允许在 ...

  3. 《Linux命令行与shell脚本编程大全》第十四章 处理用户输入

    有时还会需要脚本能够与使用者交互.bash shell提供了一些不同的方法来从用户处获得数据, 包括命令行参数,命令行选项,以及直接从键盘读取输入的能力. 14.1 命令行参数 就是添加在命令后的数据 ...

  4. 《java.util.concurrent 包源码阅读》08 CopyOnWriteArrayList和CopyOnWriteArraySet

    CopyOnWriteArrayList和CopyOnWriteArraySet从数据结构类型上来说是类似的,都是用数组实现的保存一组数据的数据结构,区别也简单就是List和set的区别.因此这里就先 ...

  5. 基于MVC设计模式的Web应用框架:struts2的简单搭建(一)

    Struts2的初步介绍 Struts2是apache项目下的一个web 框架,普遍应用于阿里巴巴.京东等互联网.政府.企业门户网站.虽然之前存在了很大的安全漏洞,在2013年让苹果.中国移动.中国联 ...

  6. PHP+Redis 实例【一】点赞 + 热度 上篇

    这次的开篇,算是总结下这段时间来的积累吧,废话不多说,直接干! 前言 点赞其实是一个很有意思的功能.基本的设计思路有大致两种, 一种自然是用mysql(写了几百行的代码都还没写完,有毒)啦 数据库直接 ...

  7. 升级 WIN8.1 VC6.0和 Visual Assist 的使用问题

    抱着好奇之心, 升级到了win8.1,没想到win8下 64位机器,原本可以运行的vc6.0(也就是 MSDEV.EXE)不能运行之,然后各种不痛快了. 经过从网上搜索,找到了改良办法,没想到微软想把 ...

  8. AngularJS 拦截器实现全局$http请求loading效果

    日常项目开发中,当前端需要和后端进行数据交互时,为了友好的UI效果,一般都会在前端加个loading的状态提示(包括进度条或者icon显示),数据传输或交互完成之后,再隐藏/删除loading提示. ...

  9. 如何用九条命令在一分钟内检查Linux服务器性能?

    一.uptime命令 这个命令可以快速查看机器的负载情况.在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量.这些数据可以让我们对系统资源使用有一个宏观 ...

  10. The requested URL / was not found on this server——Apache配置虚拟域名后无法访问localhost

    今天为了做项目,在Apache中配置了项目域名,成功访问.但是忽然发现要访问localhost突然出现The requested URL / was not found on this server. ...