现在的位置: 首页 > 综合 > 正文

Oracle基本索引的使用

2014年01月08日 ⁄ 综合 ⁄ 共 2330字 ⁄ 字号 评论关闭

一、索引的分类

序号 索引名称 中文含义
1 B*索引 最经典、最常用的索引
2 Primary Key 主键、也是也是一种索引
3 Unique Key 唯一索引
4 Function-Based Index 函数索引
5 Composite Index 多字段复合索引
6 Reverse Index 反转索引
7 Bitmap Index 位图索引
8 Cluster Index 聚簇索引
9 Cluster-Hash Index 簇哈希索引
10 Local Prefix Partitioned Index 本地前缀分区索引
11 Local non-Prefix Partitioned Index 本地非前缀分区索引
12 Global Range-Partitioned Index 全局范围分区索引
13 Global Hash-Partitioned Index 全局哈希分区索引
14 Context Index 全文搜索索引
15 CTXCA Index 文献目录索引
16 CTXRULE Index 文献分类索引
17 CTXXPASTH Index XML类型的全文索引
18 Bitmap-join Index 位图连接索引
19 ………… …………

虽然Oracle提供了如此多的索引,但是在实际中常用的索引类型也就那么几种

OLTP——联机事务处理,可以简单认为是我们的业务系统,有大量DML操作

OLAP——联机事务分析处理,可以简单认为是数据仓库,基本上都是查询操作

 

二、B*树索引(用于OLTP)

B树索引是Oracle默认索引类型,也是最常用的索引,该类索引有许多好处:

1、针对唯一值或小范围的数据的访问时非常快。特别适合与精度匹配查询与范围查询

2、B*树可以自动进行平衡

3、虽然过多的B树索引会影响DML操作,但是单个B*树索引对DML操作的影响是很小的

4、大多数情况下,B*树索引可以随着数据量的增长而很好的进行扩展

B*树单字段索引使用建议

1、分析SQL语句中约束条件的字段

2、如果条件字段不固定,可以针对单字段建立普通B*树索引

3、针对可选性高的字段建立索引

4、如果是多表连接,可以考虑在被驱动表上的连接字段加索引

5、通过对SQL语句进行分析,查看执行计划来进行优化

 

三、位图索引(用于OLAP)

位图索引是用来改善基于有很少列值的行的访问速度,例如中国有十几亿人口,那么民族至于56个,那么针对民族代码就可以建立位图索引;

在OLTP中一般不使用位图索引

 

四、函数索引

如下情况:WHERE 1=1 AND (sysdate-to_date(DT_TIME,'yyyymmddhh24miss'))*24*60<10

在DT_TIME上面加上了索引,但是发现执行计划并没有按照索引来,这里其实是Oracle的一个缺陷了,

例如:DT_TIME-7<sysdate  与 DT_TIME<sysdate+7 在我们看来是一样的,但是在Oracle眼里却是不一样的,前面的表达式不会走索引,而后面的表达式就会走索引

针对上述情况,如果索引字段在函数里面,要么简历函数索引,要么就优化表达式。但是建立函数索引有一些限制

函数索引限制:

1、必须使用一个确定的函数定义基于该函数的索引,也就是说函数仅返回一个值

2、必须使用返回可重复值的函数来定义基于该函数的索引,如sysdate就不行

3、可以对基于函数的索引进行分区,但是对基于函数的全局分区索引来说,分区键不能是索引所基于的函数

4、函数必须使用圆括号来定义,即使没有参数

5、索引基于的函数不能包含聚合函数

使用建议:

1、不要轻易在字段前面加函数

2、尽量不要将字段嵌入表达式中

3、尽量减少使用函数索引,能不用就不用,因为函数索引的维护代价比普通索引高;函数索引计算值可能大于原字段值,将消耗更多的存储空间

 

五、复合索引

 在大多数情况下,复合索引比单字段索引号,因为可以过滤出更多数据,精确定位。但是要考虑实际情况,不能滥用,不能乱用。

复合索引设计原则:

1、前缀性

也就是说到底把那个字段放在第一个未知呢,这个至关重要

例如:(col1,col2,col3)这个索引包含三个字段

  1. SELECT * FROM tab1 WHERE col1='XX'  
  2. SELECT * FROM tab1 WHERE col2='XX'  
  3. SELECT * FROM tab1 WHERE col3='XX'  
  4. SELECT * FROM tab1 WHERE col1='XX' AND NAME='CCC'  
  5. SELECT * FROM tab1 WHERE col2='XX' AND NAME='CCC'  

 

针对上面的几个SQL语句,到底谁会走索引,谁不走索引你。

其实只要含有col1='SSSS'条件的语句都会走索引

这就是为什么第一个字段为什么这么重要的原因了

 

2、可选性

就是用于索引的字段的非重复数据必须多,像用性别来做索引字段就行不通。

将字段可选性越多的字段放到前面

 

复合索引使用建议:

1、分析SQL语句中约束条件字段

2、约束条件比较固定的,优先采用B*树复合索引

3、单个字段是主键、唯一键或则其他可选性很高的字段可以建立单字段索引,节省索引开销

4、在建立复合索引的时候,优先考虑其前缀性,其次是可选性

5、如果涉及到几个条件使用频繁,但是查询组合不固定,可以分别建立单字段索引

6、如果是多表连接,可以考虑在被驱动表的连接字段与该表的其他字段创建复合索引

7、通过查看SQL语句执行计划进行分析

 

六、索引维护

1、索引并不是越多越好,因为索引会影响DML操作并且本身也会消耗存储,因此删掉没有使用的索引

2、索引碎片整理,可以定期重建压缩索引

alter index ix_name rebuild;

alter index ix_name coalesce;

抱歉!评论已关闭.