Oracle中的索引讲解

 更新时间:2022年05月07日 10:12:33   作者:springsnow  
这篇文章介绍了Oracle中的索引,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、B-树索引

索引一般是B-Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的。

create [unique] index studentin student(id [desc]);

选项择索引字段的原则:

(ORACLE在UNIQUE和主键字段上自动建立索引 。)

  • 在WHERE子句中最频繁使用的字段 。
  • 联接语句中的连接字段。
  • 选择高选择性的字段(即如果很少的字段拥有相同值,即有很多独特值,可以快速查找到所需数据的字段) .
  • 在联机事务处理(OLTP)环境下,所由并发性非常高,索引经常被修改,可以建B-TREE索引,不应该建位图索引 。
  • 不要在经常被修改的字段上建索引,可建函数索引。
  • 不要在有用到函数的字段上建索引。
  • B-Tree索引不包含null的数据。 
    可以建立一个“伪”复合索引解决。eg:
    create index my_ix on my_table(my_col,0);
    也可以用函数索引将不想索引,即使不是null也可以剔除。eg:
    create index a on table(decode(status,0,0))--只关心少数status为0的行。

二、复合索引

索引可以包含一个、两个或更多个列。两个或更多个列上的索引被称作复合索引。例如,以下语句创建一个具有两列的复合索引:(复合索引列数量不超过32个)

CREATE INDEX name  ON employee (emp_lname, emp_fname)

复合索引的第一列称为前导列(leading column)。

复合索引字段排序的原则:

  • WHERE子句中使用到的字段需要是复合索引的前导字段,若仅对后面的任意列执行搜索时,则应该创建另一个仅包含第二列的索引。
  • 如果某个字段在WHERE子句中最频繁使用,则在建立复合索引时,考虑把这个字段排在第一位(在CREATE INDEX语句中)
  • 如果所有的字段在WHERE子句中使用频率相同,则将低选择性列排在最前面,将选择性较强的列排在最后面
  • 如果所有的字段在WHERE子句中使用频率相同,如果数据在物理上是按某一个字段排序的,则考虑将这个字段放在复合索引的第一位 。
  • 在主键索引(复合主键)中列的顺序被强制为与列在表定义中出现的顺序相同,这与 PRIMARY KEY 约束中指定的列顺序无关.
  • 索引列的排序方式必须与 ORDER BY 子句完全相同或完全相反。否则不能得到性能优化。
CREATE INDEX idx_example ON table1 (col1 ASC, col2 DESC, col3 ASC)

在这种情况下,以下查询可以得到优化:

SELECT col1, col2, col3 from table1 ORDER BY col1 ASC, col2 DESC, col3 ASC

SELECT col1, col2, col3 from example ORDER BY col1 DESC, col2 ASC, col3 DESC
  • 复合索引的前导字段is (not) null 可以使用索引。

三、位图索引

创建语法是在普通索引创建的语法中index前加关键字bitmap即可,例如:

create bitmap index t_ix_执行人 on t(执行人);

位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等)。

索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码。

位图索引存储数据的方式相对于B-Tree索引,占用的空间非常小,创建时不需要排序,定位存储,创建和使用非常快。

位图索引的特点:

  • Bitmap索引允许键值为空,对位图索引列进行is(not) null查询时,则可以使用索引。
  • Bitmap索引对表记录的高效访问。当使用count(XX),可以直接访问索引就快速得出统计数据。当根据位图索引的列进行and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算。
  • Bitmap索引对批量DML操作只需进行一次索引。
  • 位图索引由于用位图反映数据,不同会话更新相同键值的同一位图段,insert、update、delete相互操作都会发锁定(未提交时)。
  • 由于并发DML操作锁定的是整个位图段的大量数据行,所以位图索引主要是用于联机分析处理(OLAP)应用。

四、函数索引

比如执行如下一条SQL语句:

select * from emp where upper(ename) = 'KING',

即使在ename上建立了索引,还是会全表扫描emp表,将里面的ename字段改成大写跟常量KING进行比较。 
如果我们建立一个基于函数的索引,比如:

create index emp_upper_idx on emp(upper(ename));

这个时候,我们只需要按区间扫描小部分数据,然后获取rowid取访问表中的数据,这个速度是比较快的。

函数索引的特点:

  • 基于函数的索引,类似于普通的索引,只是普通的索引是建立在列上,而它是建立在函数上。当然这回对插入数据有一定影响,因为需要通过函数计算一下,然后生成索引。但是插入数据一般都是少量插入,而查询数据一般数据量比较大。为了优化查询速度,稍微降低点插入速度是可以承担的。
  • 函数索引还有一个功能,只对部分行建立索引。 
    假设有一个很大的表,有一列叫做FLAG,只可能取Y和N。假设大部分数据是Y,小部分数据是N,我们需要将N修改成Y。

如果建立一个普通索引,这个索引会非常大,而且将N修改成Y的时候,维护这个索引开销会很大。

如果建立一个位图索引,但这是一个事务系统(OLTP),可能有很多人同时插入记录,或者进行修改。那么位图索引也不适合。所以,如果我们只是在值为N的行上建立索引,就比较好办了。 
只在值为N的行建立索引:

create index flag_index on big_table(case flag when 'N' then 'N' end);

这样一个索引大小会大大降低,而且维护成本也会很低的。前提是我们只对值为N的行感兴趣。

五、维护索引

  • 字典表:all_indexes、user_indexes
  • 重建索引:alter index dep_idx rebuild [online]
  • 删除索引:drop index dep_idx;

到此这篇关于Oracle索引的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Oracle 存储过程总结 二、字符串处理相关函数

    Oracle 存储过程总结 二、字符串处理相关函数

    项目中有涉及存储过程对字符串的处理,所以就将在网上查找到的资料汇总,做一个信息拼接式的总结。
    2009-07-07
  • Oracle数据库处理多媒体信息

    Oracle数据库处理多媒体信息

    Oracle数据库处理多媒体信息...
    2007-03-03
  • 使用imp和exp命令对Oracle数据库进行导入导出操作详解

    使用imp和exp命令对Oracle数据库进行导入导出操作详解

    这篇文章主要介绍了使用imp和exp命令对Oracle数据库进行导入导出操作详解,文中通过示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Oracle中部分不兼容对象迁移到OceanBase的三种处理方式

    Oracle中部分不兼容对象迁移到OceanBase的三种处理方式

    本文总结分析了 3 种 Oracle 对象和 OB 对象不兼容时的处理方法和提前统计发现的操作方式,在迁移前提前发现这类问题能有效避免在迁移过程中报错的问题,需要的朋友可以参考下
    2024-03-03
  • oracle备份一个表需要做的操作步骤

    oracle备份一个表需要做的操作步骤

    在Oracle数据库中,备份和恢复可以通过多种方式实现,下面这篇文章主要给大家介绍了关于oracle备份一个表需要做的操作步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 通过 plsql 连接远程 Oracle数据库的多种方法

    通过 plsql 连接远程 Oracle数据库的多种方法

    这篇文章主要介绍了通过 plsql 连接远程 Oracle的方法,通过plsql 工具和 oracle client(不是即时客户端 instantclient) 的方式来连接 Oracle,这是方法之一,还有其中一种方法感兴趣的朋友跟随小编一起看看吧
    2021-08-08
  • oracle(plsql)生成流水号

    oracle(plsql)生成流水号

    这篇文章主要介绍了oracle(plsql)生成流水号,需要的朋友可以参考下
    2014-03-03
  • Oracle动态视图v$active_session_history实战示例

    Oracle动态视图v$active_session_history实战示例

    这篇文章主要为大家介绍了Oracle动态视图v$active_session_history实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • ORACLE常用数值函数、转换函数、字符串函数

    ORACLE常用数值函数、转换函数、字符串函数

    本文并不准备介绍全部的oracle函数,当前情势下,俺也还没这个时间,需要学习的东西太多了,要把多数时间花在学习经常能用上的技术方面:),所以如果是准备深入了解所有oracle函数的朋友,还是去关注:Oracle SQL Reference官方文档更靠谱一些。
    2009-11-11
  • Oracle LogMiner的使用实例代码

    Oracle LogMiner的使用实例代码

    这篇文章主要给大家分享了关于Oracle LogMiner的使用实例代码,文中通过示例代码介绍了关于查询当前日志组、业务用户插入操作、归档日志切换、业务用户插入操作以及归档日志切换等等的相关功能,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07

最新评论