核心術語
| 術語 | 定義 |
| Rowid | 偽列,系統自動維護,行生命周期內唯一不變(行遷移時留指針),不可修改/刪除/插入。 |
| Recursive SQL | 為執行用戶 SQL 而內部發遞歸調用(如 DDL 修改數據字典、觸發器、缺失統計信息時查字典)。 |
| Row Source | 操作返回的符合條件行集合(全表、過濾後、Join 結果等)。 |
| Predicate | WHERE 子句中的限制條件。 |
| Driving Table (Outer) | 嵌套循環/哈希連接中首先訪問、結果集較小的行源(關鍵看過濾後行數,非表大小)。 |
| Probed Table (Inner) | 被探查的行源,通常較大,連接列需有索引。 |
| Concatenated Index | 多列索引,首列為 Leading Column,查詢必須包含首列才能使用。 |
| Selectivity | 唯一值數/總行數,越接近 1 越適合建索引、走索引掃描。 |
四大數據訪問路徑
1. Full Table Scan (FTS)
- 多塊讀 (
db_file_multiblock_read_count),高吞吐。
- 適用:無索引、需讀 >5-10% 行、並行查詢。
2. Table Access by ROWID
3. Index Scan(四類)
| 類型 | 觸發條件 | 示例 |
| Unique Scan | 唯一索引 + 等值條件 | WHERE empno=10 |
| Range Scan | 唯一索引+範圍操作符 / 非唯一索引 / 組合索引未用全列 | WHERE empno>7876 |
| Full Scan | 查詢列全在索引中,需排序 | SELECT empno,ename FROM big_emp ORDER BY empno,ename (索引 BE_IX) |
| Fast Full Scan | 查詢列全在索引中,不需排序,多塊讀+並行 | SELECT empno,ename FROM big_emp |
注意:若 SELECT 列表僅含索引列,可避免「表訪問 by ROWID」步驟,大幅減少 I/O。
三種連接算法
| 算法 | 原理 | 適用場景 | 關鍵參數 |
| Sort Merge Join (SMJ) | 雙側排序後歸併 | 非等值連接、雙側已排序(索引)、大表連接 | 無 |
| Nested Loops (NL) | 外層驅動表逐行探查內表 | 驅動表小、內表有高選擇性索引、需快速首行響應 | 無 |
| Hash Join (HJ) | 構建小表 Hash 表,探查大表 | 等值連接、CBO、大表連接、hash_area_size 充足 | HASH_JOIN_ENABLED=TRUE, hash_area_size |
- NL 可先返回結果(流水線),適合 OLTP 首屏加載。
- HJ 理論效率最高,但需足夠內存避免磁盤溢寫。
- Cartesian Product:無連接條件,極度危險,僅星型查詢特定場景使用。
選擇指南
- 小表驅動大表 + 索引 → NL
- 大表連接大表、等值、內存足 → HJ
- 非等值、或雙側已排序 → SMJ
- 統計信息準確是優化器選對連接的前提。