Oracle 索引基本原理(二)

2015-07-16 12:09:52 · 作者: · 浏览: 3
to_number(account_number) = 99999; 这样就抑制了索引的使用.


?如果上面的语句加上单引号就会使用索引了
?select bank_name,address,city,state,zip from banks where account_number='99999';


五.选择性
oracle基于查询和数据,提供了多种方法来判断使用索引的价值。首先判断索引中的唯一键或不同键的数量。可以通过对表或索引进行分析的方法来确定不同键的数量,之后就可以查询USER_INDEXES视图的DISTINCT_KEYS列来查看分析结果。比较一下不同键的数量和表中的行数(USER_INDEXES视图中的NUM_ROWS),就可以知道索引的选择性.索引的选择性越高意味着一个索引值返回的行数就越少,该索引就越好。
?索引的选择性可以帮助基于成本的优化器来决定执行路径.


六.集群因子
集群因子是索引与它所在的表相比较的有序性度量,它用于检查在索引访问之后执行的表查找的成本。
如果具有较大的集群因子,就必须访问更多的表数据块才可以获得每个索引块中对应的数据行。
如果集群因子接近于表中的数据块数量,就表示索引对应数据行的排序情况良好;但是集群因子接近于表中的数据行数量,就表示索引对应的数据块排序情况不佳。
?集群因子计算简要:
?1.按顺序扫描索引
?2.将当前索引值指向的ROWID的数据块部分与前一个索引值指向的数据块进行比较(比较索引中的邻近行)
?3.如果ROWID指向该表中不同的数据块,就增加集群因子(对整个索引执行该操作)。
?CLUSTERING_FACTOR列是USER_INDEXES视图中的一列,该列反映了数据相对于已索引的列是显得有序。


七.二元高度 (Binary Height)
索引的二元高度对把ROWID返回给用户进程时所要求的IO数量起到关键作用。二元高度的每个级别都会增加一个额外的块读取操作,而且由于这些块不能按顺序读取,它们都要求一个独立的IO操作.
例如:下面的一个二元高度为3的索引,需要读4个快才能返回一行数据给用户,其中3次用来读索引.1次用来读表。随着索引的二元高度的增加,检索数据所要求的IO次数也会随之增加.
? ? ? ? ?________
boxter? idx block id ? ? ? ?| ?|
king?idx block id --->king idx block id? ? |?|
? ?holman idx block id------>bolman? row id?| ?|
? ? ? ? histan? row id ------>_______|? ?
?level 1? ?level 2? ?level 3? 表
----------------------二元高度为3的索引(level为3叶节点所在位置)---------------------



通过查询DBA_INDEXES视图的BLEVEL列来查看它的二元高度:
EXECUTE DBMS_STATS.GATHER_INDEX_STATS('SCOTT','EMP_ID1');
select blevel,index_name from dba_indexes where index_name='EMP_ID1';



表中索引列的非NULL值数量的增加和索引列中值的范围狭窄是二元高度增加的主要原因:索引上如果有大量被删除的行,它的二元高度也会增加。重建索引可能使二元高度降低。虽然这些步骤减少了针对索引执行的IO数量,但对性能的改进却可能很小。如果一个索引中被删除的行接近20%~25%,重建索引会降低二元高度以及在一次IO中所读取的索引块中的空闲空间.


数据库中的数据块越大,索引的二元高度就越低。二元高度每增加一个级别,在DML操作期间就会额外增加性能成本。


关于BLEVEL和索引高度的更多细节
B树级别是指一个索引从它的根块到其叶块的深度。0层表名根块和叶块在同一个级别。所有索引都是从一个叶块开始,这时它代表一颗0级的B树。当行被逐渐添加到索引中时,oracle会把数据放到叶块中,随着不断有数据插入,一旦初始叶块填满,???个新块就会被创建出来,oracle以两种方式处理这个操作,90-10或50-50索引分裂法。被插入的值决定了使用哪种分裂方式:
?1.如果新值大于该索引中已有任何值,那么oracle将使用90-10分裂法,把当前块中的值复制到一个新块,将新值放到另外一个块中。
?2.如果新值不是该索引中最大的值,那么oracle会使用50-50分裂法,将较小的一半索引值放到一个新块中,将较大的另一半索引值放到另外一个新块中。
?只有在根节点分裂的情况下,索引会创建两个新块,当前的根块的内容被分割到两个新的分支块中,形成一个更高的索引树的顶部。


1.更新操作对索引的影响
索引只有在表中组成索引的列被更新时才会受到影响。当更新组成索引的表列时,索引上会执行一个删除和插入的操作。旧值被标记为已删除,与原索引条目对应的一个新值被插入。因此,索引上没有真正意义上的"更新"。索引条目通过oracle的延迟块清理功能得以清理。只有在索引条目被删除而且块被清理后,索引块中的空间才能被新条目重用。


2.删除操作对索引的影响
索引上的删除操作,并没有真正从索引中删除条目以获得空间。实际上,当表中一条记录被删除时,相应的索引条目被标记为已删除,在清理过程清理之前,仍然保留在索引中。


3.更新和删除操作对索引的影响
删除操作仍然把数据块留在叶块中,需要由清理过程清理。
在同一事务中对索引的删除/插入操作,往往会明显增大索引的大小,这种情况一般发生在同一事务执行大量这样的操作。删除操作自身不会引起索引高度或BLEVEL的增加,只不过反应了如何重用被删除行所占空间的更大的问题。所以最好拆分原事务,这有助于重用空间,不会导致索引人为地增长到大于它应有的大小。
?索引块分裂会产生大量的重做日志。
?使用本地管理的表空间以避免碎片和极少重建索引。


4.数据块大小对索引的影响
从分支块到根块都可能分裂,这种行为会导致索引的高度和分支的增加。分支索引块分裂的次数,可以通过使用较大的索引块尽量减少,这是一些专家认为应使用更大的块创建索引表空间的原因。如果每个索引块能容纳更多的数据索引分裂的出现的频率将低很多,因此可以减少索引的分支和树叶块数。将索引移到具有更大的块大小的表空间时需要重建,这时会删除所有被标记为删除的条目,压缩索引使用空间,包括回收被标记为已删除的条目的空间和条目已经删除但还没有回收或重用的空间。


八.使用直方图
在分析表或索引时,直方图用于记录数据的分布。通过获得该信息,基于成本的优化器就可以针对查询条件决定如何使用索引。如果条件返回少量行,就采用索引;如果条件返回许多行,就不采用索引。直方图的使用不限于索引。表的任何列上都可以构建直方图.


构造直方图最主要的原因就是帮助优化器在表中数据出现严重偏斜时做出更好的规划。如果一到两个值构成了表中的大部分数据,使用相关的索引就可能无法协助减少满足查询所需的IO数量,创建直方图可以让基于成本的优化器知道何时使用索引才最合适,或者何时根据where子句中的条件值,表中80%的记录会返回。


首先要指出它的大小,该大小与直方图所需的桶数相关。每个桶包含列值和行数的相关信息。
execute dbms_stats.gather_table_stats('scot