閱讀與分析 Oracle 執行計劃是 SQL 調優的核心技能。本文系統整理執行計劃中的關鍵術語、資料存取方法、連接演算法,助你快速建立完整知識框架。
| 術語 | 中文 | 定義與說明 |
|---|---|---|
| Rowid | 列位址 | 系統附加於每列的偽欄,含資料檔、區塊、列號等資訊,列生命週期內唯一 |
| Recursive SQL | 遞歸 SQL | 為執行用戶語句而由系統內部發額外操作,如資料字典維護 |
| Row Source | 行源 | 執行步驟中,上一操作回傳符合條件的列集合 |
| Predicate | 謂詞 | `WHERE` 子句中的限制條件 |
| Driving Table | 驅動表 | 連接外層表,用於 Nested Loops、Hash Join。通常選擇套用條件後回傳列較少的表 |
| Probed Table | 被探查表 | 連接內層表,應為較大行源,且連接鍵欄位宜有索引 |
| Concatenated Index | 複合索引 | 多欄位組成的索引,首欄為導引欄,謂詞必須包含導引欄索引才可用 |
| Selectivity | 選擇率 | 欄位不重複值數/總列數。接近 1 為高選擇率,適合建索引 |
透過 `db_file_multiblock_read_count` 設定多區塊讀取,利用預讀機制減少 I/O 次數。僅 FTS 可使用多區塊讀取。
ROWID 記錄列儲存位置,是 Oracle 存取單列資料的最快方法。
兩步驟:掃描索引取得 ROWID → 透過 ROWID 讀取資料。每步皆為單次 I/O。若過濾後資料量超過全表 5%-10%,索引掃描效率大幅下降。若查詢欄位全在索引中(Covering Index),可避免第二步,大幅加速。
| 連接類型 | 運作原理 | 適用場景與特點 |
|---|---|---|
| Sort Merge Join (SMJ) | 分別對驅動表與被探查表連接鍵排序,再合併 | 排序耗資源,大表通常非最佳。若兩表預先排序則效率佳 |
| Nested Loops (NL) | 驅動表每列逐一比對被探查表所有列 | 可先回傳已連接列,實現快速回應時間。適合小結果集、OLTP |
| Hash Join | 較小行源建 Hash Table/Bitmap,較大行源探查匹配 | Hash Table 能置於記憶體時極高效。需設 `hash_area_size`,僅支援等值連接 |
無連接條件或條件失效時發生,每列與另一表所有列比對,效能極差,通常為 SQL 撰寫錯誤或統計資訊過期導致。