关于oracle索引

table access by index rowid 

index single value 

index range scan 

FULL_SCAN
FAST_FULL_SCAN
SKIP_SCAN
INDEX_JOIN(BITMAP CONVERSATION)


简单的说索引分 单块所扫和多块索引扫。单块和多块的区别你应该知道。什么时候用单块,当ORACLE不知道下一步要怎么做的时候就一定是单块。既然不知道,用多块有什么意义? 如果知道下一步应该怎么走,为什么用单块? 毕竟单块效率低下。

index fast full scan,索引快速扫描。 获取的数据不需要排序,既然不要排序,当然一扫而过,所以肯定是多块获取。所以index fast full scan效率肯定高于index table full scan

index table full scan,索引全扫描,索引全扫描一定是按照排序输出,也就是数据已经排好序了。那么这个是用单块扫还是多块扫? 我感觉是单块+多块。  如果全用单块,ORACLE就太傻了。但是毕竟要按顺序出数据,所以单块是避免不了。这也是为什么上面说效率会低于FFS。

index skip scan, index range scan 这些都属于范围扫描了。单块。 ORACLE不可能一开始就查询哪些BLOCK在一个区段,然后还要查询这些数据范围是否在同一个区段,所以ORACLE只能通过brance查询指向leaf的指针,一个一个这么找。 这也是为什么当查询数据太多时,使用索引效率其实不好,不如全表扫描,因为全扫是多块。

有了概念再来看看你问的,table access by index rowid、index single value、index range scan

table access by index rowid   oracle通过INDEX找到ROWID,然后根据ROWID去表查询对应的数据。table access by index rowid一定是索引扫描后的动作,不可能以开始就table access by index rowid,否者ROWID从何处得来?

index single value是通过唯一索引,或者主键获取一条数据。这个没什么特殊啊,和index range scan一样啊,只是拿的数据是唯一的。


FULL_SCAN
FAST_FULL_SCAN  你仔细想想,能直接通过索引就获取数据的说明什么? 说明索引里就包含了数据啊。索引是由字段数据+rowid实现的啊。

所以当你看到上面2个方式第一反应就是索引里包含要获取的字段。 那么为什么会有FULL_SCAN,如果你不仅包含字段,还要排序,那么FFS肯定不行啊,FULL_SCAN就可以了啊。


SKIP_SCAN 假设有A,B 2个字段的索引,如果你只查询B字段,别的数据库,可能没有这种访问机制,但是ORACLE提供了SKIP的方式,可以通过索引扫描B。但是毕竟不是以B字段打头,所以代价比较高。

INDEX_JOIN(BITMAP CONVERSATION) 这个东西和最上面一样,索引就能获取数据,那当然可以做JOIN了。

ORACLE的概念本没那么复杂,仅仅是按照常人的思考来实现的功能,你只要稍微想想,如果是你,你会怎么来实现,那就一目了然了。

你可能感兴趣的:(oracle)