反向键索引
情景:
1,insert繁忙,主键是用序列号(每次加1),主键是有索引的,用序列号生成,因此相邻的索引记录就可能存在于同一个数据块中,引起数据块竞争,导致性能下降。
2,随着时间增长,久值被删除,新值被插入,逐渐的序列号很大,索引树是往序列号大的一面偏,树的深度加深,所以索引效率低下,造成严重的性能问题。
注意:位图索引与其他类型的索引之间不能使用这种方法进行转换;如果要转换的话,只能先删除原来的索引后,再重建成要转换类型的索引。
反转前 --反转后
123 ---321
124 ---421
125 ---521
所以反转后,原来相邻的主键就不再相邻了。就可以将相邻的序列号分散到不同的数据块中,上面情景1,2的问题就解决了。
利弊:建了反向键索引后,如果要进行范围查询(between and),就会不认索引走全表扫描,
总结:在建反向键索引时,要考虑insert操作重要,和还是范围查询重要
语法:
1,创建反向键索引
SQL> create table test3 as select * from dept;
Table created.
SQL> create index i_rev on test3(dname) reverse tablespace TEST_INDEX;
Index created.
2,查询
SQL> select INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS from user_indexes;
INDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES
---------- --------------- ------------------------------ - --------
I_REV NORMAL/REV TEST3 NONUNIQUE
PK_DEPT NORMAL DEPT UNIQUE
3,修改
SQL> alter index I_REV rebuild noreverse;
Index altered.
SQL> select INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS from user_indexes;
INDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES
---------- --------------- ------------------------------ ---------
I_REV NORMAL TEST3 NONUNIQUE
PK_DEPT NORMAL DEPT UNIQUE
SQL> alter index I_REV rebuild reverse;
Index altered.
SQL> select INDEX_NAME,INDEX_TYPE,TABLE_NAME,UNIQUENESS from user_indexes;
INDEX_NAME INDEX_TYPE TABLE_NAME UNIQUENES
---------- --------------- ------------------------------ ---------
I_REV NORMAL/REV TEST3 NONUNIQUE
PK_DEPT NORMAL DEPT UNIQUE
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26465805/viewspace-712650/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26465805/viewspace-712650/