oracle作为业界No.1的数据库,在保证性能的时候,必须使用各种索引以提高效率。本文旨在探讨oracle常用的索引类型:
B树索引
位图索引
哈希索引
索引组织表
反向键索引
基于函数的索引
分区索引
位图连接索引
B树索引
Oracle默认的索引类型,也是最通用的索引类型。B树索引可以是单列索引,也可以是符合索引,B树索引最多包含32列。
Oracle可以从两个方向上遍历这个二叉树。B树索引保存了在索引列上非空的每个数据行的ROWID值。Oracle不会对索引列上包含NULL值的行进行索引。
位图索引
位图索引是DSS和数仓的理想选择,他们不应该用于事务处理应用程序中的表。在数据量非常大的表的基数不高的列上建立位图索引,可以实现对这类表的快速访问。
位图索引最多包含30列。
位图索引对于固定长度的数据类型要比可变长度的数据类型工作的要好。
不要在高负载的OLTP中使用位图索引。
哈希索引
使用哈希索引时必须使用哈希聚簇。我没有看到有多少人在使用哈希索引和聚簇。建立聚簇或哈希聚簇的同时,也就定义了聚簇键。
Oracle可以基于哈希函数快速使用该值确定行的物理存储位置。
哈希索引可能是访问数据库中数据的最快捷方法,但是也有其自身缺点。在创建哈希聚簇之前必须要知道聚簇键上不同值的数目,而且在创建哈希聚簇的时候指定这个值。
索引组织表
索引组织表会把表的存储结构改成B树结构,以表的主键进行排序。
又累类似cluter index,mysql中貌似应用的更广泛。
反向键索引
对于 1234 1235 1236存储到磁盘上的时候就是6321 5321 4321,区分度立马大大提升,效率也就高了。
但是这样做的缺点是,也只能用于col = ?的情况,无法用于范围查询。
函数索引
create index emp_uppper_job on emp(upper(job));
为了使得优化器可以使用函数索引,需要设置参数QUERY_REWRITE_ENABLED=true。
分区索引
分区索引就是简单地把一个索引分成多个片段,通过把索引分成多个物理片段,可以访问更小的片段。
B树索引和位图索引都可以被分区,哈希索引不可以被分区。
分区索引又分为两种类型:本地索引和全局索引。每种类型又分为两种子类型:有前缀索引和无前缀索引。
对索引分区最主要的原因是可以减少所需读取的索引的大小。
本地索引是与表使用相同的分区键和范围界限的索引。
有前缀索引:包含分区键并把它们作为索引的前导列的索引。
无前缀索引:是指没有把分区键的前导列作为索引的前导列的索引。
全局索引在一个索引分区中包含来自多个表分区的键值。在创建全局索引时,必须定义分区键的范围和值。
全局索引只能是B树索引。
位图连接索引
位图连接索引是基于两个表的连接的位图索引,在数仓环境中使用这种索引可以提高连接维度表和事实表的查询性能。
快速重建索引:
alter index cust_idx rebuild parallel tablespace cust_tblspc1 storage (pctincrease 0);
在线重建索引:
create index index_name on table (col) online; #眼熟不眼熟?