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

Oracle資料存取路徑全解析:全表掃描、ROWID、四種索引掃描

     編輯:Oracle 資料庫基礎

一、全表掃描 (Full Table Scan, FTS)

  • 讀取表中所有行,檢查WHERE條件
  • 使用多區塊讀取 (DB_FILE_MULTIBLOCK_READ_COUNT),單次I/O讀多個區塊
  • 每個區塊僅讀一次,極高吞吐量
  • 適用場景:小表、擷取比例>5-10%、平行查詢
EXPLAIN PLAN FOR SELECT * FROM dual;
-- TABLE ACCESS FULL DUAL

二、ROWID存取 (Table Access by ROWID)

  • ROWID編碼:資料檔號+區塊號+行號,定位單行最快路徑
  • 單區塊讀取,不使用多區塊讀
  • 常見於索引查找後的表存取
EXPLAIN PLAN FOR SELECT * FROM dept WHERE rowid = 'AAAAyGAADAAAAATAAF';
-- TABLE ACCESS BY ROWID DEPT

三、索引掃描 (Index Scan) - 兩階段過程

  1. 掃描索引取得ROWID
  2. 透過ROWID回表取資料 (單區塊讀,易成物理I/O瓶頸)

關鍵洞察:若查詢欄位全在索引中,可省略第2階段 (Index Only Scan),效能大增。

四、四種索引掃描類型詳細比較

類型觸發條件特點範例
INDEX UNIQUE SCAN唯一索引 + 等值條件 (PK/UK)回傳單一ROWID,最精準WHERE empno = 10 (PK)
INDEX RANGE SCAN① 唯一索引+範圍操作符(>,<,>=,<=,BETWEEN)
② 複合索引僅用前導欄位
③ 非唯一索引任何查詢
回傳多個ROWID,順序讀取WHERE empno > 7876
INDEX FULL SCAN查詢欄位全在索引中,需排序輸出單區塊讀取索引葉子塊,按序輸出SELECT empno,ename FROM big_emp ORDER BY empno,ename (複合索引)
INDEX FAST FULL SCAN查詢欄位全在索引中,不需排序多區塊讀取,可平行,最高吞吐量SELECT empno,ename FROM big_emp (複合索引)

五、實戰判讀EXPLAIN PLAN技巧

-- 僅查詢索引欄位 → INDEX FAST FULL SCAN (最快)
SELECT empno FROM big_emp;

-- 查詢索引欄位+排序 → INDEX FULL SCAN
SELECT empno, ename FROM big_emp ORDER BY empno, ename;

-- 範圍查詢 + 回表 → INDEX RANGE SCAN + TABLE ACCESS BY ROWID
SELECT empno, ename FROM emp WHERE empno > 7876 ORDER BY empno;

避坑指南:INDEX FAST FULL SCAN不保證順序,若需排序必須顯式ORDER BY,優化器會轉為INDEX FULL SCAN或排序操作。

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