前言

   索引是常见的数据库对象,建立索引的目的是为了提高记录的检索速度。它的设置好坏,使用是否得当,极大地影响数据库应用程序和Database的性能。虽然有许多资料讲索引的用法,DBA和Developer们也经常与它打交道,但还是有不少的人对它存在误解,比如我本人就不是很清楚这其中的道理。所以特此进行总结,也请大牛们来给检查检查,分享下你们的经验。

什么情况下会使用到索引

  一般来说,对于单列索引,只要Select、Delete、Update语句的Where条件中有此列,就会使用此索引。

  对于多列索引,假如一个表中的主键(ID,Name,Age三个字段联合索引),只有当Where条件中包含索引中的前一个或几个列时才会用到索引。

  如ID条件,ID、Age组合条件,ID、Name、Age组合条件,而仅有Name、Age条件,没有ID条件是不会使用索引的。因为此索引是先根据ID排序,ID相同的再根据Name排序,ID、Name相同的再根据Age排序。

什么情况下应该为表建立索引

  一般来说,满足下列条件的应该建立索引:

  1、列经常被用在Where条件中或连接条件中

  2、列的数据比较分散,即重复值不多

  3、列包含大量的空值

  4、几个列经常一起用在Where条件或连接条件中(联合索引)

  5、大部分的检索只返回大表中的小部分记录(2%~5%)

什么情况下不应该为表建立索引

  不应该建立索引的情况有:

  1、表的数据量不大

  2、列很少用在查询条件中

  3、大部分的检索都返回大量的数据  

  4、表的Update操作很频繁

但索引并非总是最佳选择,如果发现Oracle在有索引的情况下,没有使用索引,这并不是优化器出错。在有些情况下,Oracle确实会选择全表扫描(Full Table Scan),而非索引扫描(Index Scan)。这些情况通常有:
  1、表未做统计,或者统计陈旧,导致Oracle判断失误。
  2、根据该表拥有的记录数和数据块数,实际上全表扫描要比索引扫描更快。

但是,Oracle是否真正使用索引,使用索引是否真正有效,还是必须进行实地的测验。合理的做法是,对缩写的复杂sql,在将它写入应用程序之前,先在产品数据库上做一次执行计划(explain)。explain会获得Oracle对该sql的解析(plan),可以明确地看到Oracle是如何优化该sql的。

如果经常做explain,就会发现,喜爱写发扎的sql并不是好习惯,因为过分复杂的sql其解析计划往往不尽如人意。事实上,如果库表结构设计的合理,一般情况下我们很少需要写复杂的sql。将复杂的Sql拆开,有时候会极大地提高效率,因为能获得很好的优化。

用索引提高效率

  通常情况下,通过索引查询数据比全表扫描要快。同样在联结多个表时使用索引也可以提高效率。另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证。不过使用索引时也必须注意到它的代价。索引需要空间来存储,也需要定期维护,每当有记录在表中增减或索引列被修改时,索引本身也会被修改。这意味着每条记录的Insert、Delete、Update将为此多付出4、5此的磁盘I/O。因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。

  Oracle对索引有两种访问模式:

  索引唯一扫描(Index Unique Scan)

  索引范围查询(Index Range Scan)

  适用于两种情况:1、基于一个范围的检索  2、基于非唯一性索引的检索

  当where子句中有多个索引列,且包含非“=”号时,Oracle会放弃使用非“=”号的索引

  当where子句中有多个索引列,且都为非“=”号时,Oracle将只使用一个索引,至于使用那个索引,这个还要看情况而定。

强制索引失效

  如果两个或以上具有相同的等级,而我们只想使用其中的一个(通过它,检索出的记录数量少),我们可以使用下面的方法:

select Ename from EMP
where ENo=7935
and DNo=10
and EType='A'

如果我们只想用到ENo上的索引(相对另外两个条件记录数量很少,做合并不划算)则可改编为:

select EName from EMP

where ENo=7935

and DNo+0=10   /*DNo上的索引将不会使用/*

and EType|| ''='A'  /*EType上的索引将不会使用/*

同样,如果我们想使用某个列上的索引,则不能对此列做运算。

select * from DEPT

where SAL*12>25000

不能使用SAL列上的索引,可改编为:

select * from DEPT

where SAL>25000/12

总结

  对Oracle的索引了解还不是很深入,只是浮于表面的认识,日后要多加使用研究。

Oracle初级索引学习总结的更多相关文章

  1. oracle唯一索引与普通索引的区别和联系以及using index用法

    oracle唯一索引与普通索引的区别和联系 区别:唯一索引unique index和一般索引normal index最大的差异是在索引列上增加一层唯一约束.添加唯一索引的数据列可以为空,但是只要尊在数 ...

  2. MySQL中的联合索引学习教程

    MySQL中的联合索引学习教程 这篇文章主要介绍了MySQL中的联合索引学习教程,其中谈到了联合索引对排序的优化等知识点,需要的朋友可以参考下   联合索引又叫复合索引.对于复合索引:Mysql从左到 ...

  3. Oracle教程之学习笔记

    Oracle教程之学习笔记... ----------------------------------- Oracle教程:---学习笔记: ============================= ...

  4. 数据库之Oracle——初级

    世上岂无千里马,人中难得九方皋: 酒船鱼网归来是,花落故溪深一篙. 关于数据库的第一篇博客,这是我的第二次,人生第二春,什么也不想说,静静的开始吧,至于为什么写唐诗,请看第一篇文章! Oracle 初 ...

  5. Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  6. SQL索引学习-聚集索引

    这篇接着我们的索引学习系列,这次主要来分享一些有关聚集索引的问题.上一篇SQL索引学习-索引结构主要是从一些基础概念上给大家分享了我的理解,没有实例,有朋友就提到了聚集索引的问题,这里列出来一下: 其 ...

  7. oracle建索引的可选项

    oracle中建索引可能大家都会,但是建索引是有几个选项参数却很少有人关注,在某些特殊环境下,可能会非常有用,下面一一说明: 1.NOSORT,记录排序可选项. 默认情况下,在表中创建索引的时候,会对 ...

  8. oracle 创建索引思考(转)

    在Oracle数据库中,创建索引虽然比较简单.但是要合理的创建索引则比较困难了. 笔者认为,在创建索引时要做到三个适当,即在适当的表上.适当的列上创建适当数量的索引.虽然这可以通过一句话来概括优化的索 ...

  9. Oracle 重建索引脚本

    该指数是一个有力的武器,以提高数据库的查询性能. 没有索引,喜欢同样的标签库没有书籍,找书,他们想预订比登天还难.中,尤其是在批量的DML的情形下会产生对应的碎片.以及B树高度会发生对应变化.因此能够 ...

随机推荐

  1. AxureRP8实战手册

    基础操作篇 本篇包含56种常见的基础操作,初学者应在掌握本篇内容后再进行实战案例篇的学习,以免产生学习障碍.同时,建议具备一定基础的读者学习本篇中相对生疏的内容,并加以掌握. 第1章 使用元件 本文目 ...

  2. Java 发送http post 请求

    package com.sm.utils; import java.io.BufferedReader; import java.io.InputStreamReader; import java.i ...

  3. python-tkinter学习实例

    在好友的邀请下,尝试用tkinter做一个卡牌的普通界面显示,正好练习下python的写法.  花了两天学习,写了两天代码,做了个最基本的demo.显示如下: 其中需要引入的第三方库主要有,PIL.P ...

  4. TokenAutication源码分析

    创建的token如何交给前端进行使用呢? 在官方文档说明中,将产生的這个token放在header中 TokenAutication认证原理 用户认证成功以后,会在服务端产生一个Token.并且服务端 ...

  5. Web大前端面试题-Day2

    1.伪类与伪元素的区别? 1) 定义区别 伪类 伪类用于选择DOM树之外的信息,或是不能用简单选择器进行表示的信息. 前者包含那些匹配指定状态的元素,比如:visited,:active:后者包含那些 ...

  6. 【BZOJ 1061】 1061: [Noi2008]志愿者招募 (线性规划与网络流)**

    1061: [Noi2008]志愿者招募 Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短 ...

  7. BZOJ4161 常系数齐次线性递推

    问了数竞的毛毛搞了一番也没太明白,好在代码蛮好写先记下吧. #include<bits/stdc++.h> using namespace std; ,mod=1e9+; int n,k, ...

  8. [CQOI2007]涂色

    [CQOI2007]涂色 题目大意: 假设你有一条长度为\(n\)的木版,初始时没有涂过任何颜色.每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色.问达到给定的目标至少要多少次操 ...

  9. Slickflow.NET 开源工作流引擎基础介绍(八) -- 自动化任务调度实现介绍

    前言:审批流程中常见的都是人工类型任务,但是也会有一些自动化的任务需要定时触发.因此,引擎框架中需要解决掉两个问题:选择合适的任务调度框架,集成新的任务调度模块. 1. 任务调度框架选择 Hangfi ...

  10. STM32F1XX devices vector table for EWARM toolchain.

    ;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************* ;* File Name : start ...