2014-06-01 BaoXinjian In Capgemini
一、摘要
在PLSQL查询优化中,使用和接触最多的应该是索引Index这个概念,个人也觉得对Index选择和优化是程式优化过程中比较重要的概念,特别是刚开始接触PLSQL性能优化
索引的一些概念
- 一个索引可以由一个或多个列组成,
- 对列设置索引其实就是对列的内容按一定的方式进行排序,检索数据的时候,检索排过序的数据,检索到最后一个有效数据之后就跳出检索
- 这样就不必进行全表扫描了,同时可以应用很多算法提高检索效率
- 数据库多用二分法检索数据
索引的连接方式
- Hash Join
- Nested Loops
- Merge Join
索引的分类
- B-树索引
- 反向索引
- 降序索引
- 位图索引
- 函数索引
- 建立索引后需要分析索引才能是索引生效
- 主键和唯一性索引的区别
索引的中Hints使用
- 强制索引
有些情况下虽然在查询栏位中定义了index,但是PLSQL并没有走该栏位的索引,因为Oracle在解析计划时一种基于Role,一种是基于Cost有些情况下走Index的效率比全表扫秒更低,并不是建了Index,PLSQL性能会成倍提高,更糟的情况下,建Index还会导致性能比原来无索引更糟,这里有个理解误区,所以稍微提一下 ;)
而且,有时候你建立的索引可能应为空间或其他原因被失效后,所以会导致某些程式原本没有任何问题,突然出现性能问题,而且是非常大性能问题,所以对EBS DBA也有较高的要求,能监控一些系统异常
一、索引的连接方式
1. Hash Join
2. Nested Loops
3. Merge Join
具体解析
1. Hash Join
(1).概述
i. 读取一个表的资料,并将放置到内存中,并建立唯一关键字的位图索引
ii. 读取另一个表,和内存中表通过Hash算法进行比较
(2).适用对象
i. 大表连接小表
ii. 两个大表
2. Nested Loops
(1).概述
i. 循环外表记录
ii. 进行逐个比对和内标的连接是否符合条件
(2).适用对象
小表驱动大表,返回较少的结果集
3. Merge Join
(1).概述
i. 两个表进行table access full
ii. 对table access full的结果进行排序
iii. 进行merge join对排序结构进行合并
(2).适用对象
通过rowid访问数据
二、索引的分类
1. B-树索引
2. 反向索引
3. 降序索引
4. 位图索引
5. 函数索引
6. 建立索引后需要分析索引才能是索引生效
7. 主键和唯一性索引的区别
具体解析
1. B-树索引
(1).概述
最常用的索引结构,默认建立的索引就是这种结构
适用于高基数数据列(该列的值大多不一样)
(2).建立方式
CREATE INDEX index_name ON wip_entities (wip_entity);
2. 反向索引
(1).概述
(2).建立方式
3. 降序索引
(1).概述
适用于需要降序排列的列
(2).建立方式
CREATE INDEX index_name ON wip_entities (wip_entity DESC);
4. 位图索引
(1).概述
适用于低基数数据列(该列的值大多是一样)
(2).建立方式
CREATE BITMAP INDEX index_name ON wip_entities (sex);
5. 函数索引
(1).概述
适用于该列需要适用函数的列
(2).建立方式
CREATE INDEX index_name ON wip_entities (TRUNC(creation_date));
6. 分析索引
ANALYZE INDEX index_name COMPUTE STATISTICS;
7. 主键和唯一性索引的区别
(1). 主键是约束,唯一性索引只是一个索引
(2). 主键不可以为空,唯一性可以为空
三. 索引的中Hints使用
1. 建立一个测试表,和测试索引
1 CREATE TABLE dba_name ( 2 3 username VARCHAR(100), 4 5 password VARCHAR(100) 6 7 ) ; 8 9 CREATE INDEX index_t ON dba_name(username) ;
2. 方法比较
(1). 未使用强制索引
SELECT *
FROM dba_name
WHERE username = ‘BAOXINJIAN‘
(2). 使用过强制索引
SELECT /*+ index(t index_t) */
*
FROM dba_name t
WHERE username = ‘BAOXINJIAN‘
(3). 有些情况下虽然在查询栏位中定义了index,但是PLSQL并没有走该栏位的索引,因为Oracle在解析计划时一种基于Role,一种是基于Cost
有些情况下走Index的效率比全表扫秒更低,并不是建了Index,PLSQL性能会成倍提高,更糟的情况下,建Index还会导致性能比原来无索引更糟,这里有个理解误区,所以稍微提一下 ;)
Thanks and Regards