访问路径:说是是如何从数据库中取数据,一般说来对于表的小部分数据用到索引访问,对于访问表的大部分数据全表扫描更有效。
在OLTP系统中,有些SQL是小的[我理解为操作数据量不大的]那些SQL,可用索引来访问,相反在 Decision support systems中,使用分区表,全表扫描相关分区或许更好。
需要了解以下访问路径:
Full Table Scans
Rowid Scans
Index Scans
Cluster Access
Hash Access
Sample Table Scans
How the Query Optimizer Chooses an Access Path
Full Table Scan?
这种扫描方式过虑掉那些SELECT中不需要的数据,读取表中所有行,当执行全表扫描的时候,表中所有在高水位标记下的块被扫描,高水位标记暗示了表使用的空间情况.或者说空间被表中数据格式化.每一行都被检查,以发现表中数据是不是和where条件中的相符。
当oracle执行全表扫描的时候,所有的块被顺序读.I/O calls larger than a single block can be used to speed up the process. 参DB_FILE_MULTIBLOCK_READ_COUNT决定读取块的大小.使用多块读全表扫描将更有效。每一个块只读一次.
为什么说全表扫描在访问大数据量的时候很有效?
因为全表扫描使用比较大的IO调用,这种大的IO调用,比调用多个小的IO花费的代价要小些[原文:This is because full table scans can use larger I/O calls, and making fewer large I/O calls is cheaper than making many smaller calls]
那么何时使用全表扫描呢?
1.缺少索引
如果查询语句中没有使用到现在的索引,就会用全表扫描.如果说索引列上使用了索引,那么优化器也会执行全表扫描。比如:upper(index列)
2.访问数据量很大时
当优化器认为:你要取的数据,将需要访问表中的绝大多数块时,它就会走全表扫描。尽管如此,通过索引来访问往往更好.
3.足够小的表
当表包含的块数据小于参数DB_FILE_MULTIBLOCK_READ_COUNT 的大小,在高水位标记以下。一次IO操作就可以把表中数据读取,这个时候全表扫描就很有效。
4. high degree of parallelism
A high degree of parallelism for a table skews the optimizer toward full table scans over range scans. Examine the DEGREE column in ALL_TABLES for the table to determine the degree of parallelism.
5.使用hint full(table 别名)强制优化器走全表扫描.
6.并行查询的时候
当全表扫描的时候,响应时间可以通过并行这个特点来缩小。并行查询一般应用于数据仓库环境.
Rowid Scans?
表中第一行的ROWID指定的该行的数据文件,块(包含该行在块中的位置).通过rowid来定位表中数据是最快的,因为数据库中第一行确切的位置是指定好的。
当使用rowid方式来访问表的时候,ORACLE先获取SELECT语句中那些行的ROWID,通过WHERE条件或者是索引扫描,然后定位选择的每一行.
index scans?
这种方式下,一行数据被取回,通过语句中指定的索引。为了进行索引扫描,ORACLE查找索引列上的索引,如果语句访问的只是索引列,那就直接读取索引
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15720542/viewspace-629974/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15720542/viewspace-629974/