當查詢使用索引找到符合條件的 ROWID,但 SELECT 清單包含索引未涵蓋的欄位,Oracle 必須再以 ROWID 回資料區塊讀取完整列資料。執行計劃顯示 TABLE ACCESS BY INDEX ROWID 即為回表操作。
建立測試表 big_table (300 萬筆),索引 idx_big_table_created(created)。
EXPLAIN PLAN FOR
SELECT created
FROM big_table a
WHERE created = TO_DATE('2010/3/30 10:08:30', 'yyyy/mm/dd hh24:mi:ss');
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

計劃僅顯示 INDEX RANGE SCAN,無 TABLE ACCESS。
EXPLAIN PLAN FOR
SELECT id, created
FROM big_table a
WHERE created = TO_DATE('2010/3/30 10:08:30', 'yyyy/mm/dd hh24:mi:ss');
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

出現 TABLE ACCESS BY INDEX ROWID,確認回表。
建立組合索引 idx_comp(created, object_name),查詢同時包含這兩欄位:
EXPLAIN PLAN FOR
SELECT object_name, COUNT(1)
FROM big_table a
WHERE created >= TO_DATE('2010/3/30 10:07:50','yyyy/mm/dd hh24:mi:ss')
AND created <= TO_DATE('2010/3/30 10:08:37','yyyy/mm/dd hh24:mi:ss')
GROUP BY object_name;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

計劃僅有 INDEX RANGE SCAN,達到「覆蓋索引」效果,零回表。
COMPRESS n 可大幅縮小索引體積,降低 I/O,但會增加 CPU 解壓開銷。INDEX FULL SCAN 或 INDEX SKIP SCAN (10g+),效率通常較差。buffer busy waits / gc buffer busy。不改變前導欄位邏輯,僅改變物理儲存順序。