A-A+

有关索引-其他索引类型

2013年03月29日 BasicKnowledge 评论 1 条 阅读 2,115 次

索引学习-其他索引类型

1.不可见索引
1)“不可见”索引可以对优化器隐藏该索引
2)其最大的用途是测试是否应该删除某个索引
3)可以在需要时指定使用索引,其余时间使其不可见
4)数据库还是会继续维护不可见索引的
5)即使指定hint提示也不会是优化器使用到不可见索引
6)可以在会话或者系统级别使用参数 optimizer_use_invisible_indexes设置为true来使优化器使用到这些不可见索引,也可用hint提示在此时使用这些不可见索引
7)数据库对不可见索引的维护和维护普通索引的方式是一样的,可以用dbms_stats.gather_index_stats来收集优化器统计信息

2.函数索引
1)使用函数索引的优势是,数据库将提前计算好一个列或者涉及多个列的函数或者表达式的值,并把值存储在所创建的基于函数的索引中
2)可以使用case语句创建函数索引,这样一来可以对感兴趣的值进行索引,以达到对部分数据进行索引的目的
3)在创建基于用户自定义函数的索引时,该函数必须是确定性的,但是oracle不会去验证函数本身的确定性
4)返回值的长度受到函数返回数据类型的最大长度限制,如果返回值超过允许的最大长度,oracle不会发出任何错误提示,而是直接截断值并返回
5)在使用了复杂的用户自定义函数后,oracle的插入及更新操作将会变得更加缓慢,但是对于查询带来了好处
6)oracle在后台将基于函数创建的索引表达式使用虚拟列来表示的,故可以收集这些基于函数的索引的统计信息
7)oracle自动在创建这些基于函数的索引的时候会收集其统计信息
8)创建了基于函数的索引后,必须马上收集隐藏列的统计信息
9)也可收集函数表达式的统计信息
10)索引表达式的数据类型不能是varchar2、raw、long raw或者不定长的pl/sql数据类型
11)数据库做or展开时,会忽略基于函数的索引
12)索引表达式不能调用聚合函数,如:sum()

3.虚拟列上的索引
1)只有当某个虚拟列的值备查询时,才会计算该列的值
2)虚拟列减少了触发器的使用
3)在虚拟列上创建索引,将是基于函数的索引
4)可以用添加一个虚拟列并对他创建索引的办法,代替在表中的一个或者多个列上创建基于函数的索引
5)如果重新编译了函数,那么就必须重建虚拟列上的索引,在重新启用虚拟列上的约束后,必须重新收集表上的统计信息

4.键压缩索引
1)键压缩允许在一个索引块的后缀条目共享前缀条目,从而能在每个索引块中存储更多的键
2)11G中,新的oltp表压缩功能可以在所有的dml中启用数据压缩,可在在线环境中使用,oracle读取压缩数据时不用解压他们,数据在高速缓存中也保持压缩格式。
3)oracle只压缩索引中的前导列
4)在复合索引中确保前导列是低基数的情况下会产生良好的压缩效果
5)无论是前缀值还是后缀值,都存储在相同的索引块中
6)在使用默认键压缩时,将会压缩前导列中的所有列
7)compress关键字后边的数字,告诉oracle数据库应该压缩多少列。在非唯一索引中,默认是压缩所有列;在唯一索引中,是压缩总列数减1
8)在任何时候都可以利用nocompress子句来重建索引来禁用索引键压缩
9)只要是B树索引,就可以用键压缩来压缩他的一个或者多个分区
10)键压缩可以减少索引的叶块数
11)可以使用视图index_stats的opt_cmpr_count和opt_cmpr_pctsave来估算压缩效率(注意,视图index_stats在收集了指定索引的统计信息后才会填充值进去)

5.复合索引
1)当查询的where子句中引用了索引的所有列或者甚至只是前导列时,优化器会考虑使用复合索引
2)如果查询不包含复合索引的前导列时,优化器会忽略索引(以前的版本),在以后的版本中,将会使用索引跳跃式扫面,跳过前导列(此时使用的是逻辑子索引)。
3)如果符合索引的前导列只有部分少量的不同值,而索引的非前导部分却包含了大量不同的值,这个时候就非常适合使用跳跃式扫描
4)oracle建议将访问频繁的列放在索引中的最靠前的位置
5)在决定使用哪一个列作为前导列时,建议使用聚簇因子作为标准(聚簇因子表示与索引条目中的排列方式比较,表中行的有序程度)

6.虚拟索引
1)在创建索引时指定nosegment子句出来的是虚拟索引
2)虚拟索引不占用任何存储空间,并在默认情况下对基于成本的优化器时不可见的
3)在视图dba_indexes中指存储有实际索引段的信息的索引
4)在将参数 _use_nosegment_indexes为true后,虚拟索引才对优化器可见
5)在测试一个潜在索引的有效性时,建议使用不可见索引
6)只有在行弄清楚如果建立一个索引会发生什么,但又不想通过实际的创建索引的机制来测试时,才适合创建虚拟索引
7)不能对无段索引进行重建和修改
8)在创建无段索引的时候只是填充了几个数据字典而已,并没有与该索引的索引树存在
9)创建无段索引可以在没有耗费磁盘空间的情况下测试索引的可用性

7.反向键索引
1)反向键索引适合在rac环境使用
2)在rac环境中,当大量并发会话同时插入数据到单调递增的索引节点时,会导致对相同索引块的争用
3)反向键索引,只是在插入索引数据之前反转索引列的值
4)在rac环境中使用反转键值索引,往往会加快批量数据加载速度
5)反转键值索引可以大大减缓缓冲区忙等待
6)使用反转键值索引时,就不能使用该索引的范围扫描(如谓语为between,<=,<,>,>=),但是可以使用索引快速全扫描,但有轻微的cpu开销
7)在查询有相等谓词时才能使用反向键索引
8)分区索引具有多个索引的根块,可以减少索引根块的争用
9)可以使用in子句来代替谓词以曲线代替范围,在oracle中,数据库会将in替换成or,而or可以用到反转键值索引
10)如果执行非唯一反向键索引上的等值搜索,由于重复的值存储在索引结构中,数据库将执行索引范围扫描(这个其实就是因为有重复值存在,也就是小范围的范围扫描)
11)散列分区全局索引可以通过分散插入提高插入性能
12)在rac中建议使用noorder和cache(一般是增大缓冲大小)选项来创建序列,以减少索引争用
13)在索引块面临争用时,将出现buffer busy和read by other session等待事件,进而会出现high buffer busy waits等待事件
14)在创建反转键值索引时只是在一般的创建语句后加上关键字reverse
15)普通索引和反转键值索引可以通过重建在二者之间进行切换

8.应用域索引
应用域索引支持创建自己的索引结构,以实现目前oracle数据库中没有的新的索引类型

1 条留言  访客:0 条  博主:0 条   引用: 1 条

来自外部的引用: 1 条

  • 不可见索引测试 | YallonKing

给我留言

Copyright © YallonKing 保留所有权利.   Theme  Ality

用户登录

分享到: