oracle 索引分类、使用场合和创建方法

逻辑上:
Single column 单行索引
Concatenated 多行索引
Unique 唯一索引   CREATE UNIQUE INDEX  索引名 on 表名(想要创建索引的列名);
NonUnique 非唯一索引
Function-based函数索引 
(基于函数的索引 
1基于函数的索引是常规的B树索引。 
2该索引存放的数据是由表中的数据应用函数后得到的,而不是直接存放表中的数据本身。 
3如果查询条件包含与索引相同的函数,就可以使用基于函数的索引,提高查询速度 
例:下面为创建时间转换函数的索引
create index INDEX_DATE on test_table  (to_date( col1||col2,'YYYY-MM-DD HH24:MI:SS')) 

Domain 域索引
 
物理上:
Partitioned 分区索引

        global索引和local索引

  1. CREATE INDEX INX_TAB_PARTITION_COL1 ON TABLE_PARTITION(COL1)  
  2.   GLOBAL PARTITION BY RANGE(COL1)(  
  3.          PARTITION IDX_P1 values less than (1000000),  
  4.          PARTITION IDX_P2 values less than (2000000),  
  5.          PARTITION IDX_P3 values less than (MAXVALUE)  
  6.   );  
NonPartitioned 非分区索引
B-tree:
Normal 正常型B树
Rever Key 反转型B树 
Bitmap 位图索引
 
索引结构:
B-tree:
适合与大量的增、删、改(OLTP);
不能用包含OR操作符的查询;
适合高基数的列(唯一值多)
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围;
Bitmap:
适合与决策支持系统;
做UPDATE代价非常高;
非常适合OR操作符的查询; 
基数比较少的时候才能建位图索引;
 
树型结构:
索引头 
开始ROWID,结束ROWID(先列出索引的最大范围)
BITMAP
每一个BIT对应着一个ROWID,它的值是1还是0,如果是1,表示着BIT对应的ROWID有值

1. b-tree索引
Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE 
INDEX语句时,默认就是在创建b-tree索引。没有特别规定可用于任何情况。
2. 位图索引(bitmap index)
位图索引特定于该列只有几个枚举值的情况,比如性别字段,标示字段比如只有0和1的情况。
3. 基于函数的索引
比如经常对某个字段做查询的时候是带函数操作的,那么此时建一个函数索引就有价值了。
4. 分区索引和全局索引
这2个是用于分区表的时候。前者是分区内索引,后者是全表索引
5. 反向索引(REVERSE)
这个索引不常见,但是特定情况特别有效,比如一个varchar(5)位字段(员工编号)含值
(10001,10002,10033,10005,10016..)
这种情况默认索引分布过于密集,不能利用好服务器的并行
但是反向之后10001,20001,33001,50001,61001就有了一个很好的分布,能高效的利用好并行运算。
6.HASH索引

HASH索引可能是访问数据库中数据的最快方法,但它也有自身的缺点。集群键上不同值的数目必须在创建HASH集群之前就要知道。需要在创建HASH集群的时候指定这个值。使用HASH索引必须要使用HASH集群。


3 各种索引的创建方法

(1)*Tree索引。
Create index indexname on tablename(columnname[columnname...])
(2)反向索引。
Create index indexname on tablename(columnname[columnname...]) reverse
(3)降序索引。
Create index indexname on tablename(columnname DESC[columnname...])
(4)位图索引。
Create BITMAP index indexname on tablename(columnname[columnname...])
(5)函数索引。
Create index indexname on tablename(functionname(columnname))
注意:创建索引后分析要索引才能起作用。
analyze index indexname compute statistics;

4 各种索引使用场合及建议(1)B*Tree索引。

常规索引,多用于oltp系统,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。
(2)反向索引。
B*Tree的衍生产物,应用于特殊场合,在ops环境加序列增加的列上建立,不适合做区域扫描。
(3)降序索引。
B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。
(4)位图索引。
位图方式管理的索引,适用于OLAP(在线分析)和DSS(决策处理)系统,应建立于低cardinality列,适合集中读取,不适合update、insert、delete频繁的列
代价很高,不适合键值较多的列(重复值较少的列)
10G对位图索引的存储进行了优化,一个键值在索引块中只有一个位图,提供比B*Tree索引更节省的空间。
(5)函数索引。
B*Tree的衍生产物,应用于查询语句条件列上包含函数的情况,索引中储存了经过函数计算的索引码值。可以在不修改应用程序的基础上能提高查询效率。


Hints是Oracle提供的一个辅助用法,按字面理解就是‘提示’的意思,确实它起得作用也是提示优化器按它所提供的关键字来选择执行路径,特别适用于sql调整的时候。使用方法如下:

{DELETE|INSERT|SELECT|UPDATE} /*+ index( indexname)*/


猜你喜欢

转载自blog.csdn.net/nevergup/article/details/80206844
今日推荐