Oracle索引分析与比较92834

上传人:cn****1 文档编号:561938301 上传时间:2022-12-10 格式:DOC 页数:24 大小:62.50KB
返回 下载 相关 举报
Oracle索引分析与比较92834_第1页
第1页 / 共24页
Oracle索引分析与比较92834_第2页
第2页 / 共24页
Oracle索引分析与比较92834_第3页
第3页 / 共24页
Oracle索引分析与比较92834_第4页
第4页 / 共24页
Oracle索引分析与比较92834_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《Oracle索引分析与比较92834》由会员分享,可在线阅读,更多相关《Oracle索引分析与比较92834(24页珍藏版)》请在金锄头文库上搜索。

1、Oracle索引分析与比较92834首先给出各种索引的简要解释: b*tree index:几乎所有的关系型数据库中都有b*tree类型索引,也是被最多使用的。其树结构与二叉树比较类似,根据rid快速定位所访问的行。 反向索引:反转了b*tree索引码中的字节,是索引条目分配更均匀,多用于并行服务器环境下,用于减少索引叶的竞争。 降序索引:8i中新出现的索引类型,针对逆向排序的查询。 位图索引:使用位图来管理与数据行的对应关系,多用于OLAP系统。 函数索引:这种索引中保存了数据列基于function返回的值,在select * from table where function(column

2、)=value这种类型的语句中起作用。 2 各种索引的结构分析 2.1 B*Tree索引B*Tree索引是最常见的索引结构,默认建立的索引就是这种类型的索引。B*Tree索引在检索高基数数据列(高基数数据列是指该列有很多不同的值)时提供了最好的性能。当取出的行数占总行数比例较小时B-Tree索引比全表检索提供了更有效的方法。但当检查的范围超过表的10%时就不能提高取回数据的性能。B-Tree索引是基于二叉树的,由分支块(branch block)和叶块(leaf block)组成。在树结构中,位于最底层底块被称为叶块,包含每个被索引列的值和行所对应的rowid。在叶节点的上面是分支块,用来导航

3、结构,包含了索引列(关键字)范围和另一索引块的地址。 假设我们要找索引中值为80的行,从索引树的最上层入口开始,定位到大于等于50,然后往左找,找到第2个分支块,定位为75100,最后再定位到叶块上,找到80所对应的rowid,然后根据rowid去读取数据块获取数据。如果查询条件是范围选择的,比如where column 20 and column select number,dump(1,16) from dual 2 union all select number,dump(2,16) from dual 3 union all select number,dump(3,16) from

4、dual; NUMBE DUMP(1,16) - - number Typ=2 Len=2: c1,2 (1) number Typ=2 Len=2: c1,3 (2) number Typ=2 Len=2: c1,4 (3) 再对比一下反向以后的情况: SQL select number,dump(reverse(1),16) from dual 2 union all select number,dump(reverse(2),16) from dual 3 union all select number,dump(reverse(3),16) from dual; NUMBE DUMP(

5、REVERSE(1),1 - - number Typ=2 Len=2: 2,c1 (1) number Typ=2 Len=2: 3,c1 (2) number Typ=2 Len=2: 4,c1 (3) 我们发现索引码的结构整个颠倒过来了,这样1,2,3个索引码基本上不会出现在同一个叶块里,所以减少了争用。不过反向索引又一个缺点就是不能在所有使用常规索引的地方使用。在范围搜索中其不能被使用,例如,where columnvalue,因为在索引的叶块中索引码没有分类,所以不能通过搜索相邻叶块完成区域扫描。 2.3 降序索引 降序索引是8i里面新出现的一种索引,是B*Tree的另一个衍生物,它

6、的变化就是列在索引中的储存方式从升序变成了降序,在某些场合下降序索引将会起作用。举个例子,我们来查询一张表并进行排序: SQL select * from test where a between 1 and 100 order by a desc,b asc; 已选择100行。 Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=100 Bytes=400) 1 0 SORT(ORDER BY)(Cost=2 Card=100 Bytes=400) 2 1 INDEX (RANGE SCAN) OF IND_BT

7、 (NON-UNIQUE) (Cost=2 Card=100 Bytes=400) 这里优化器首先选择了一个索引范围扫描,然后还有一个排序的步骤。如果使用了降序索引,排序的过程会被取消。 SQL create index test.ind_desc on test.testrev(a desc,b asc); 索引已创建。 SQL analyze index test.ind_desc compute statistics; 索引已分析 再来看下执行路径: SQL select * from test where a between 1 and 100 order by a desc,b as

8、c; 已选择100行。 Execution Plan(SQL执行计划,稍后会讲解如何使用)。 - 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=100 Bytes=400) 1 0 INDEX (RANGE SCAN) OF IND_DESC (NON-UNIQUE) (Cost=2 Card=100 Bytes=400) 我们看到排序过程消失了,这是因为创建降序索引时Oracle已经把数据都按降序排好了。另外一个需要注意的地方是要设置init.ora里面的compatible参数为8.1.0或以上,否则创建时desc关键字将被忽略。1 2.

9、4 位图索引 位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引最好用于低cardinality列(即列的唯一值除以行数为一个很小的值,接近零),例如又一个“性别”列,列值有“Male”,“Female”,“Null”等3种,但一共有300万条记录,那么3/3000000约等于0,这种情况下最适合用位图索引。 位图索引可以是简单的(单列)也可以是连接的(多列),但在实践中绝大多数是简单的。在这些列上多位图索引可以与AND或OR操作符结合使用。位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)、或NULL值。位图索引的位图存放在B-Tree结构

10、的页节点中。B-Tree结构使查找位图非常方便和快速。另外,位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要小得多。 如果搜索where gender=Male,要统计性别是”Male”的列行数的话,Oracle很快就能从位图中找到共3行即第1,9,10行是符合条件的;如果要搜索where gender=Male or gender=Female的列的行数的话,也很容易从位图中找到共8行即1,2,3,4,7,8,9,10行是符合条件的。如果要搜索表的值的话,那么Oracle会用内部的转换函数将位图中的相关信息转换成rowid来访问数据块。 2.5 函数索引 基于函数的索引也是8i

11、以来的新产物,它有索引计算列的能力,它易于使用并且提供计算好的值,在不修改应用程序的逻辑上提高了查询性能。使用基于函数的索引有几个先决条件: (1)必须拥有QUERY REWRITE(本模式下)或GLOBAL QUERY REWRITE(其他模式下)权限。 (2)必须使用基于成本的优化器,基于规则的优化器将被忽略。 (3)必须设置以下两个系统参数: QUERY_REWRITE_ENABLED=TRUE QUERY_REWRITE_INTEGRITY=TRUSTED 可以通过alter system set,alter session set在系统级或线程级设置,也可以通过在init.ora添加

12、实现。这里举一个基于函数的索引的例子: SQL create index test.ind_fun on test.testindex(upper(a); 索引已创建。 SQL insert into testindex values(a,2); 已创建 1 行。 SQL commit; 提交完成。 SQL select /*/*+ RULE*/* FROM test.testindex where upper(a)=A; A B - - a 2 Execution Plan - 0 SELECT STATEMENT Optimizer=HINT: RULE 1 0 TABLE ACCESS (FULL) OF TESTINDEX (优化器选择了全表扫描) - SQL select * FROM test.testindex where upper(a)=A; A B - - a 2 Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE (C

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号