![](https://csdnimg.cn/release/download_crawler_static/86343926/bg6.jpg)
给出详细说明。现在先来看一些预备知识
访问路径—access path
优化器在形成执行计划时需要做的一个重要选择是如何从数据库查询出需要的数据。对于
SQL 语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位
和查询出需要的数据。优化器选择其中自认为是最优化的路径。
在物理层,oracle 读取数据,一次读取的最小单位为数据库块(由多个连续的操作系统块组
成),一次读取的最大值由操作系统一次 I/O 的最大值与 multiblock 参数共同决定,所以即
使只需要一行数据,也是将该行所在的数据库块读入内存。
➢ 逻辑上,oracle 用如下存取方法访问数据:
➢ 1 全表扫描(Full Table Scans, FTS)
➢ 2 通过 ROWID 的表存取(Table Access by ROWID 或 rowid lookup)
➢ 3 索引扫描(Index Scan 或 index lookup)
全表扫描
➢ 为实现全表扫描,Oracle 读取表中所有的行,并检查每一行是否满足语句的 WHERE 限
制条件。Oracle 顺序读取分配给表的每个数据块,直到读到表的最高水线处(high water
mark, HWM,标识表的最后一个数据块)。一个多块读操作可以使一次 I/O 能读取多块
数据块(db_block_multiblock_read_count 参数设定),而非只读取一个数据块,这极大的
减少了 I/O 总次数,提高了系统的吞吐量,所以利用多块读的方法可以高效实现全表扫
描,而且只有在全表扫描的情况下才能使用多块读操作。在这种访问模式下,每个数
据块只被读一次。由于 HWM 标识最后一块被读入的数据,而 delete 操作不影响 HWM
值,所以一个表的所有数据被 delete 后,其全表扫描的时间不会有改善,一般我们需
要使用 truncate 命令来使 HWM 值归为 0。幸运的是 oracle 10G 后,可以人工收缩 HWM
的值。
➢ 由 FTS 模式读入的数据被放到高速缓存的 Least Recently Used (LRU)列表的尾部,这样可
以使其快速交换出内存,从而不使内存重要的数据被交换出内存。
➢ 使用 FTS 的前提:在较大的表上不建议使用全表扫描,除非取出数据的比较多,超过
总量的 5% -- 10%,或你想使用并行查询功能时。
例子
SELECT * FROM dual;