首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

六分钟掌握 Oracle 全表扫描 (FTS) 原理与适用边界

     編輯:Oracle 資料庫基礎

物理读取单位

  • 最小单位:数据库块 (由多个 OS 块组成),典型 8KB/16KB。
  • 最大单位:DB_FILE_MULTIBLOCK_READ_COUNT × 块大小,受限于 OS 最大 I/O 大小。

即使仅需 1 行,Oracle 也会将该行所在块整块读入内存。

全表扫描 (FTS) 机制

  1. 顺序读取表段所有块,直到 高水位线 (HWM) 标记的最后一个块。
  2. 多块读一次 I/O 读取多个块,大幅降低 I/O 次数,提升吞吐。
  3. 读入块置于 LRU 列表冷端,快速淘汰,保护热点数据不被冲刷。

HWM 关键特性

  • DELETE 不降低 HWM,全表扫描时间不变。
  • TRUNCATE 重置 HWM 至 0,后续 FTS 极快。
  • 11g+ 支持 ALTER TABLE ... SHRINK SPACE 在线收缩 HWM。

适用性判断矩阵

场景建议理由
小表 (≤ 数千块)✅ 首选 FTS索引开销大于顺序读
大表,需访问 > 5%-10% 行✅ FTS 更优多块读吞吐 > 单块随机读
大表,需访问 < 2% 行❌ 避免 FTS索引范围扫描 + ROWID 回表更快
并行查询 (PQ)✅ 强制 FTSPQ 仅支持全表/分区扫描

执行计划识别

EXPLAIN PLAN FOR SELECT * FROM DUAL;
-- PLAN_TABLE_OUTPUT
-------------------------------------------------
| Id | Operation          | Name | Cost |
-------------------------------------------------
|  0 | SELECT STATEMENT   |      |     1|
|  1 |  TABLE ACCESS FULL | DUAL |     1|
-------------------------------------------------

TABLE ACCESS FULL 即标识 FTS。

ROWID 访问对比

EXPLAIN PLAN FOR SELECT * FROM DEPT WHERE ROWID = 'AAAAyGAADAAAAATAAF';
-- Operation: TABLE ACCESS BY ROWID
-- 单块读,最快定位单行,但不支持多块读

一句话总结:FTS 是顺序多块读,适合大比例数据访问与并行查询;小比例精准查找请走索引 + ROWID。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved