Oracle 將 SQL 文本與執行計劃缓存於 SGA 共用池。共享條件極嚴格:
硬編碼 SQL(字面值)導致無法共享。Oracle 8i 引入 CURSOR_SHARING 參數(預設 EXACT),設為 FORCE 可將字面值自動轉為綁定變數,但可能引發性能退化,**建議開發階段直接使用綁定變數**。
DBMS_ROWID 解析| 術語 | 定義 |
|---|---|
| Recursive SQL | 為執行用戶 SQL 而內部產生的額外 SQL(如 DDL 修改數據字典、字典快取未命中) |
| Row Source | 上一步驟返回的符合條件行集合(全表、子集、連接結果) |
| Predicate | WHERE 限制條件 |
| Driving Table (Outer) | 嵌套循環/Hash Join 中外層迭代的 Row Source,宜選擇經過 Predicate 過濾後行數較少者 |
| Probed Table (Inner) | 內層被探查的 Row Source,宜有索引支援高效查找 |
| Concatenated Index | 多欄組合索引,查詢必須包含 Leading Column 才會使用 |
| Selectivity | 唯一值數量 / 總行數,越接近 1 越適合建索引 |
計劃呈樹狀,編號反映觀察順序,**非執行順序**。葉子節點(如全表掃描、索引掃描)最先執行,父節點等待子節點返回 Row Source 後執行。
兩類父節點啟動機制:
FIRST_ROWS 目標ALL_ROWS 目標db_file_multiblock_read_count),資料置於 LRU 尾部。適用:小表、需讀取 >5-10% 資料、並行查詢。| 演算法 | 核心機制 | 適用場景 | 關鍵參數 |
|---|---|---|---|
| Sort Merge Join (SMJ) | 雙邊排序後合併 | 非等值連接、雙邊已有索引/預排序、大表連接 | 排序成本高,若結果集過大導致大量 ROWID 回表則效能下降 |
| Nested Loops (NL) | 外層逐行探查內層(索引) | 外層行數少、內層有高選擇性索引、需快速返回首行 | 驅動表選擇關鍵,違反原則若物理 I/O 更少仍可採用 |
| Hash Join (HJ) | 小表建 Hash Table + Bitmap,大表探查 | 等值連接、大表連接、CBO 模式、HASH_AREA_SIZE 足夠 |
需 HASH_JOIN_ENABLED=TRUE,記憶體不足時性能劣於 NL/SMJ |
無連接條件導致,結果行數 = 表 A 行數 × 表 B 行數。除星型查詢特殊需求外,**嚴禁出現**。
掌握 Row Source 流向、存取路徑選擇邏輯、連接演算法適用邊界,是閱讀執行計劃並精準調優的基石。下一篇將示範如何獲取與分析真實執行計劃。