一、为什么引入索引:提高查询的效率,加快查询速度。

在计算机的所有操作当中,I/O操作应该是最慢的,使用索引减少了I/O操作就等于加快了查询的速度。

二、建立、查看、删除索引

1、建立索引的两种方式:

A、Oracle系统自动建立:当用户在一个表上建立逐渐(Primary Key)或惟一(UNIQUE)约束时,Oracle系统会自动创建唯一索引(UNIQUE INDEX)。

主键约束:ALTER TABLE tableName ADD CONSTRAINT constraintName PRIMARY KEY(col1,.....);

唯一约束:ALTER TABLE tableName ADD CONSTRAINT constraintName UNIQUE(col1,.....);

B、手工建立:用户在一个表中的一列或多列上用Create Index语句来创建非唯一索引(NONUNIQUE INDEX)。

普通索引:CREATE INDEX indexName ON tableName (列名|表达式[,列名|表达式]...);

Oracle 公司推荐的索引命名方式:表名_列名_对象的类型,比如ORDER_ORDERNO_IDX 。

示例:CREATE INDEX order_orderno_idx ON order (order_no);

CREATE INDEX order_orderno_idx ON order (UPPER(order_no)); --函数索引

CREATE INDEX order_adddte_idx ON order (add_dte-7); --函数索引

注:SELECT * FROM order WHERE add_dte>sysdate-1不走如上索引,因为左侧不是add_dte-7;

若用add_dte建索引,add_dte-7>sysdate-10不走该索引,当add_dte>sysdate-3才会使用。

2、建立索引的几点指导原则(当下列条件之一成立时;反过来说就是什么时候不应该建立索引):

1)表很大而且大多数查询的返回数据量很少(Oracle推荐为小于总函数的百分之二到百分之四),因为如果返回数据量很大的话就不如顺序地扫描整个表了;

2)此列的取值范围很广,一般为随机分布;

3)一列或多列经常出现在WHERE子句或连接条件中;

4)表上的DML操作较少;

5)此列中包含了大量的空值(NULL);

6)此列不经常作为SELECT语句中的某个表达式的一部分;

3、查看索引:

1)查看索引概况:从视图USER(或ALL或DBA)_INDEXES中查询

常见列:INDEX_NAME:索引名称

INDEX_TYPE:索引类型,包含LOB,NORMAL,FUNCTION-BASED NORMAL。

函数索引在视图中列名格式为SYS_NC00000$
                                   TABLE_NAME:建立索引的表的名称

UNIQUENES:唯一索引或者非唯一索引,值为UNIQUE或NONUNIQUE

STATUS:VALID,INVALID

2)查看索引列:从视图USER(或ALL或DBA)_IND_COLUMNS中查询

常见列:INDEX_NAME:索引名称
                                   TABLE_NAME:建立索引的表的名称

COLUMN_NAME:使用索引的列名

COLUMN_POSITION:索引列顺序,单值索引为1,复合索引为1,2,3,....

3)使用执行计划查看索引是否在一个语句中使用:

如果没有找到plan_table,需要执行$ORACLE_HOME\rdbms\admin\utlxplan下的这个脚本。

使用命令:SQL>EXPLAIN PLAN FOR sql语句 ;

最后查询SELECT * FROM plan_table;即可看到执行计划。

一般使用的列:SELECT id,operation,options,object_name,position FROM plan_table;

4)查看索引使用情况:

ALTER INDEX cust_name_idx MONITORING USAGE;(9i以后版本)

这个命令开销很小,之后可以使用V$OBJECT_USAGE视图和USAGE字段(值为YES和NO)来判断索引是否被访问过。得到批量监控语句的方法如下:

SQL>set pages 999
                SQL>set heading off  
                SQL>spool run_mon.sql  
                SQL>select 'alter index ' || index_name || ' monitoring usage;' from dba_indexes where owner = 'XXX';
                SQL>spool off
                SQL>@run_mon

对于Oracle9i之前的版本,监控索引使用的唯一方法是执行他们的程序库缓中的所有SQL,然后手工记下所有被使用的索引。

4、删除索引:DROP INDEX 索引名;

该DDL将从数据字典中删除索引的定义,并释放这个索引所占用的磁盘空间。

所需权限:索引的所有者或具有DROP ANY INDEX的系统权限。

其它用处:DBA向数据库导入大量数据时,可以先删除索引,导完后再重建索引。

三、索引的存储结构(待续...)

四、使用索引的注意事项

避免在一个表上创建过多的索引(Over Indexes),尤其对DML操作频繁的表,过多索引会大大降低DML操作的速度。要控制索引的数量,在查询速度与DML操作速度之间做出折中。

Oracle Indexes(索引)相关推荐

  1. SQL Server,Oracle,DB2索引建立语句的对比

    http://database.51cto.com/art/201108/284540.htm SQL Server,Oracle,DB2索引建立语句的对比 2011-08-17 20:48 henr ...

  2. oracle 批量 重建索引,Oracle重建索引Shell脚本、SQL脚本分享

    索引是提高数据库查询性能的有力武器.没有索引,就好比图书馆没有图书标签一样,找一本书自己想要的书比登天还难.然而索引在使用的过程中,尤其是在批量的DML的情形下会产生相应的碎片,以及B树高度会发生相应 ...

  3. ORACLE虚拟索引(Virtual Index)

    ORACLE虚拟索引(Virtual Index)   虚拟索引概念 虚拟索引(Virtual Indexes)是一个定义在数据字典中的假索引(fake index),它没有相关的索引段.虚拟索引的目 ...

  4. Oracle——03索引

    Oracle--03索引 Oracle 索引 详解 创建Oracle索引的标准语法: CREATE INDEX 索引名 ON 表名 (列名)      TABLESPACE 表空间名; 创建唯一索引: ...

  5. 如何获得Oracle分区索引类型

    碰巧在墨天轮上看资料就看到了eygle的这篇文章<如何获得 Oracle 分区索引的类型 - 全局分区索引.本地分区索引>,秉承了eygle大神一如既往的风格,文章"短小&quo ...

  6. ORACLE的索引和约束详解

    Oracle的约束 * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约束,但如果某个约束作用于多个字段, 必须在表级定义约束 * 在定义约束时可以通过CONSTRAINT关 ...

  7. oracle 函数索引

    http://bbs.51cto.com/thread-26271-1.html 如何创建oracle函数索引 Oracle8i的很重要的一个新特性就是增加了function-based index这 ...

  8. Oracle之索引和索引碎片问题解决

    反正死锁问题你看到刚才那个结果就够了,就是他已经把死锁问题给你解决了,毕竟你只要出现死锁,毕竟有一方用户就弹出来了,退出了,直接就弹出来了,这是ORACLE系统自己去解决了,咱们继续往下看 下面咱们要 ...

  9. Oracle 11g Release 1 (11.1) Oracle 本文索引的四种类型

    http://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm#g1020588 本文内容 对于 Oracle 文本,你可以使用 CREATE ...

  10. 资源放送丨《Oracle数据库索引分裂详解》PPT视频

    点击上方"蓝字" 关注我们,享更多干货! 前段时间,墨天轮邀请数据库资深专家 孙加鹏 老师分享了<Oracle数据库索引分裂详解>,在这里我们将课件PPT和实况录像分享 ...

最新文章

  1. Jira停售本地版,已购企业最大化降低损失的几种方法
  2. 极大似然估计的理解与应用
  3. AlphaGo之父对话《连线》,曾被导师劝阻研究强化学习,如今获得ACM计算奖
  4. django使用ckeditor富文本编辑器-转
  5. 上传图片即时显示图片
  6. Ilya Muromets(DP or 思维)
  7. iOS convertRect:view.frame toView: x 异常翻倍?
  8. JavaScript(六)—— DOM 事件高级
  9. Java从入门到放弃第1天
  10. C++:空间坐标映射到球面坐标/全景图
  11. 北京轨道交通明起推出电子定期票 不享累计优惠政策
  12. 常见图片尺寸大小(厘米 cm,象素 px)
  13. Unity3D新手入门初中高级教程
  14. prf###.tmp临时文件导致磁盘资源不足
  15. 浅谈大数据背景下数据库安全保障体系
  16. 服务器响应请求状态码(详细版)
  17. 揭秘数字资产行业隐藏的17家国外机构大牛
  18. JavaScript实现输入数值判断是否为质数、合数的代码
  19. Excel如何快速删除空白行?替换部分字符?
  20. 大学matlab选择试题和答案,大学matlab试题和答案

热门文章

  1. 干货|小白如何在两个月入门数学建模
  2. 00942 ora 表存在_ORA-00942: 表或视图不存在 的原因和解决方法
  3. 互联网日报 | 5月19日 星期三 | 阿里巴巴去年销售农产品3037亿元;快手将推出首届电商晚会;网易严选上线“网易万家”...
  4. 分布式存储综述、存储原理与设计
  5. Two_Arch2:改进的双档案多目标优化算法
  6. 还怕搞不定秋招?Java8年架构大能分享“Java面试突击秋招手册“,背完轻松应付面试官,再拿不到offer真不怪我了
  7. 中华诗词 v2007.03.25 清风明月版 官方
  8. Django中的CBV视图
  9. c语言EasyX库入门学习
  10. kotlin——xml解析