Oracle 访问表的方法:
1) 全表扫描(Full Table Scans, FTS)
为实现全表扫描,Oracle 读取表中所有的行,扫描该表中高水位线(HWM, High Water Mark)以
下的所有数据块。随着数据量的增加,高水位线会不断上涨,读取的数据块就会不断增加。在做 Delete
操作的时候即使把表中的数据都删掉了,高水位线不会降低,这样在做全表扫描的时候效率依然不会提高。
2) 通过 ROWID 的表存取(Table Access by ROWID)
行的 ROWID 指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过 ROWID 来存取
数据可以快速定位到目标数据上,是 Oracle 存取单行数据的最快方法。
3) 索引扫描(Index Scan)
我们先通过 index 查找到数据对应的 rowid 值(对于非唯一索引可能返回多个 rowid 值),然后根
据 rowid 直接从表中得到具体的数据,这种查找方式称为索引扫描。一个 rowid 唯一的表示一行数据,
该行对应的数据块是通过一次 i/o 得到的,在此情况下该次 i/o 只会读取一个数据库块。
在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的 ROWID 值。
索引扫描可以由 2 步组成:
(1) 扫描索引得到对应的 rowid 值。
(2) 通过找到的 rowid 从表中读出具体的数据。
索引扫描效率并不会随着数据量的递增而明显降低。
但是如果查询的数据能全在索引中找到,就可以避免进行第 2 步操作,避免了不必要的 I/O,此时即
使通过索引扫描取出的数据比较多,效率还是很高的
根据索引的类型与 where 限制条件的不同,有 4 种类型的索引扫描:
索引唯一扫描(index unique scan)
索引范围扫描(index range scan)
索引全扫描(index full scan)
索引快速扫描(index fast full scan)
(1) 索引唯一扫描(index unique scan)
通过唯一索引查找一个数值经常返回单个 ROWID.如果存在 UNIQUE 或 PRIMARY KEY 约束(它保
证了语句只存取单行)的话,Oracle 经常实现唯一性扫描。
使用唯一性约束的例子:
SELECT * FROM APP_RETAILER_PORTAL.T_RETAILER A WHERE A.ID = 125;
Query Plan
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 234 | 2 | 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID | T_RETAILER | 1 | 234 | 2 | 00:00:01 |
| * 2 | INDEX UNIQUE SCAN | PK_T_RETAILER | 1 | | 1 | 00:00:01 |
----------------------------------------------------------------------------------------