1. 概述
在oracle中有两种方式可以访问表里面的数据:
1. 全表扫描:oracle服务器扫描这个表所有在高水位线(HWM)下面的数据块。
2. 通过rowid访问:表中的每一行数据都有一个唯一标志位,叫做rowid,这样,当然我们就可以通过rowid来访问这一行数据。(oracle中索引正是通过rowid访问表中行数据的)
2. 全表扫描
全表扫描方式,是扫描这个表在数据文件中的所有块。你可以一次读取多个块,这个是由参数db_file_mutiblock_read_count决定,默认是16. 当oracle按顺序全表扫描时,读取到的块放到buffer cache里面的LRU队列上面,从LRU队列最后面开始寻找空闲位置或者可以被替代的数据块。但是如果是并行扫描,这个块不会放在buffer cache里面,那么从磁盘读取之后,放到了PGA里面。(这个我也不是很明白,估计并行扫描会出现LRU队列的争用情况)
全表扫描可以很有效率在获取很多行数据的时候(大约是在大于表数据10%的时候),否则,索引扫描更快。
高水位线是这个表用的最后一个块的位置,如果很多行被删除了的话,高水位线也不会变。这样在高水位线下面即使有很多块没有数据,这些块依然会被读取。(当你发现表里面没有几行数据,访问速度依然缓慢的时候,需要考虑高水位线的问题了)
3. 通过rowid访问
通常,我们不会直接提供rowid给数据库,让它通过rowid来访问数据。我们一般是在通过索引获取数据的时候,oracle内部会自动转换成rowid来访问数据。