Oracle索引详解

Oracle索引详解(一)

### --索引介绍

??索引对于Oracle学习来说,非常重要,在数据量巨大的状况下,使用恰到好处的索引,将会使得数据查询时间大大减少,于2017/12/25暂时对Oracle中的索引进行一个大致的了解。

  • 索引的创建语法
  • 索引的特点
  • 索引的不足
  • 比较适合建立索引的列的特点
  • 不适合建立索引的列的特点
  • 限制索引(建立了索引,但是无法使用)
  • 查询索引
  • 组合索引
  • Oracle rowid
  • 选择性
  • 群集因子
  • 二元高度
  • 快速全表扫描
  • 跳跃式扫描

索引的创建语法

create or replace unique|bitmap index <schema>.<index_name> on <schema>.<table_name>
  (<column_name>|<expression> asc|desc ,
   <column_name>|<expression> asc|desc ...)
    tablespace <tablespace_name>
    storage <storage_settings>
    logging|nologging
    compute statistics
    nocompress|compress<nn>
    nosort|reverse
    partition|global partition<partition_setting> 
  • unique|bitmap : unique表示唯一值索引,bitmap表示位图索引,为空则默认为B-tree索引
  • column_name|expression asc|desc , ... :可以单列索引,也可以多列进行联合索引,当为
  • tablespace : 制定存放索引的表空间(当表和索引在不同的表空间的时候,效率更高)
  • storage : 可以设置表空间的存储参数
  • logging|nologging : 是否对索引产生redolog(对于大表来说,可以设置为nologging从而来减少空间占用,提高效率)
  • compute statistics : 设置为创建索引时,收集统计信息
  • nocompress|compressnn : 是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)
  • nosort|reverse : nosort表示与表中相同的顺序进行创建索引,reverse表示使用与表中相反的顺序进行创建索引
  • partition|nopartition|global partition : 可以在分区表上和未分区表上对创建的索引进行分区

索引的特点

  1. 大大加快检索数据的速度
  2. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
  3. 加速表与表之间的连接
  4. 查询语句汇总含有分组或者排序的语句时,速度更快
  5. 查询的过程中,使用索引,使用优化隐藏器,从而提高系统的性能

索引的不足

  1. 创建和维护索引,比较耗费时间,随着数据量的增大而增大
  2. 创建索引,占一定的物理空间(聚簇索引,占用空间会更大)
  3. 在对表进行增删改的时候,索引相应的也需要进行动态的更新

比较适合建立索引的列的特点

  1. 经常需要搜索的列上
  2. 主键,一般建立唯一性索引,保持数据的唯一性
  3. 外键,提高表与表之间连接的速度
  4. 需要排序的列上
  5. where子句后边经常出现的字段
  6. 经常需要根据范围进行搜索的列上,比如日期

不适合建立索引的列的特点

  1. 很少进行搜索的列上
  2. 列取值比较少的列上
  3. blob类型的列上
  4. 修改频率比较高的列上

限制索引(建立了索引,但是无法使用)

  1. 使用不等于<> 、 != ,(不等于操作符一定会进行全表扫描)
  2. 使用is null 、 is not null (只要索引中出现一个null,那么这个索引就报废了。所以在建立索引的时候,一定要将准备建立索引的列设置为not null)
  3. 使用函数(where子句中含有trunc()、add_months()之类)的时候,sql优化器会自动忽略掉索引
  4. where子句中,进行了数据类型不匹配的比较,比如(where row_num = ‘1‘)的时候,生气了优化器会限制索引的使用

查询索引

  • dba_indexes
  • user_indexes
  • uesr_ind_columns

组合索引

  1. 索引中,包含不止一个列。
  2. 在Oracle9i之前,需要先使用前导索引,才能使用组合索引。

Oracle rowid

??实体表中,每一行都有rowid,通过每一行的rowid,Oracle提供了访问单行数据的能力。

选择性

??user_indexes中distinct_keys,选择性越高,那么索引返回的值就越少。

群集因子

??user_indexes中的clustering factor 越接近 leaf block的值的话,说明表中的数据越有序。

二元高度

??dba_indexes 的 Blevel列查看对应索引的二元高度,二元高度随着表的大小以及被索引的列中,值的范围的狭窄程度而变化。重建索引可以降低二元高度。

快速全表扫描

??允许Oracle执行一个全局索引的扫描操作,快速全表扫描可以快速读取B-tree索引上的所有树叶块。

跳跃式扫描

create index TT_index on TT(teamid,areacode);

select /*+ index(tt TT_index )*/ count(areacode) from tt;

原文地址:https://www.cnblogs.com/wang-junxi/p/8111663.html

时间: 2024-12-28 00:38:47

Oracle索引详解的相关文章

【转载】oracle索引详解2

原文URL:http://justplayoop1.iteye.com/blog/1259562 一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC,                <column_na

【转载】oracle索引详解

原文URL;http://www.oschina.net/question/30362_4057?fromerr=FiY27yLL 作者:crazyinsomnia 一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0-9, +, 和 /, row在数据块中的存储方式 SELECT ROWID, last_name FROM hr.employees WHERE department_id = 20; 比 如:OOOOOOFFFBBBBBBRRR

Oracle 索引 详解

一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC,               <column_name> | <expression> ASC | DESC,...)      T

Oracle ROWID详解

1.ROWID定义 ROWID:数据库中行的全局唯一地址 对于数据中的每一行,rowid伪列返回行的地址.rowid值主要包含以下信息: 对象的数据对象编号 该行所在的数据文件中的数据块 该行中数据块的位置(第一行是0) 数据行所在的数据文件(第一个文件是1).该文件编号是相对于表空间. 通常来说,一个rowid值唯一标识数据中的一行.然而,存储在同一聚簇中不同的表可以有相同的rowid. 2.扩展ROWID 从Oracle 8i开始使用扩展rowid标识行物理地址 扩展rowid使用base6

【转载】oracle 分区表详解

一.分区表的概述:     Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具.     分区功能能够将表.索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区.每个分区有自己的名称,还可以选择自己的存储特性.从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使

ORACLE存储过程详解

ORACLE存储过程详解 1.定义 所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作. 2.存储过程的创建 Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常. (1)无参存储过程语法 1 2 3 4 5 6 7 8 create or replace procedure

oracle 序列 详解

序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l  自动提供唯一的数值 l  共享对象 l  主要用于提供主键值 l  将序列值装入内存可以提高访问效率 创建序列: 1.  要有创建序列的权限 create sequence 或 create any sequence 2.  创建序列的语法 CREATE SEQUENCE sequence  //创建序列名称        [INCREMENT BY n]  //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1

Oracle SGA详解

SGA(SYSTEM Global Area )系统全局区 l 数据高速缓存 在Oracle进行数据处理的过程中,代价最昂贵的就是物理 I/O操作了.同样的数据从内存中得到要比从磁盘上读取快的多.因此,优化Oracle的一个重要的目标就是尽可能的降低物理 I/O操作. Oracle的 Buffer Cache用于缓存从磁盘中读取的数据,当 Oracle需要查找某些信息的时候,首先会在 BufferCache中寻找,如果找到了,则直接将结果返回.如果找不到,则需要对磁盘进行扫描, Oracle将在

mysql索引详解,摘自《MySQL 5权威指南》

本文介绍了数据库索引,及其优.缺点.针对MySQL索引的特点.应用进行了详细的描述.分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用.本文摘自<MySQL 5权威指南>(3rd)的8.9节.(2007.07.05最后更新)        索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.注:[1]索引不是万能的!索引可以加快数据检索操作,但会使数据修改操作变慢.每修改数据记录,索引