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

Oracle執行計劃核心概念全解析:存取方法、連接類型與關鍵術語

     編輯:Oracle 資料庫基礎

閱讀與分析 Oracle 執行計劃是 SQL 調優的核心技能。本文系統整理執行計劃中的關鍵術語、資料存取方法、連接演算法,助你快速建立完整知識框架。

一、核心術語定義

術語中文定義與說明
Rowid列位址系統附加於每列的偽欄,含資料檔、區塊、列號等資訊,列生命週期內唯一
Recursive SQL遞歸 SQL為執行用戶語句而由系統內部發額外操作,如資料字典維護
Row Source行源執行步驟中,上一操作回傳符合條件的列集合
Predicate謂詞`WHERE` 子句中的限制條件
Driving Table驅動表連接外層表,用於 Nested Loops、Hash Join。通常選擇套用條件後回傳列較少的表
Probed Table被探查表連接內層表,應為較大行源,且連接鍵欄位宜有索引
Concatenated Index複合索引多欄位組成的索引,首欄為導引欄,謂詞必須包含導引欄索引才可用
Selectivity選擇率欄位不重複值數/總列數。接近 1 為高選擇率,適合建索引

二、Oracle 資料存取方法

1. Full Table Scan (FTS,全表掃描)

透過 `db_file_multiblock_read_count` 設定多區塊讀取,利用預讀機制減少 I/O 次數。僅 FTS 可使用多區塊讀取。

2. Table Access by ROWID (ROWID 查找)

ROWID 記錄列儲存位置,是 Oracle 存取單列資料的最快方法。

3. Index Scan (索引掃描)

兩步驟:掃描索引取得 ROWID → 透過 ROWID 讀取資料。每步皆為單次 I/O。若過濾後資料量超過全表 5%-10%,索引掃描效率大幅下降。若查詢欄位全在索引中(Covering Index),可避免第二步,大幅加速。

四種索引掃描類型

  • Index Unique Scan: Unique/PK 索引,回傳單一 ROWID
  • Index Range Scan: 範圍操作符(>, <, >=, <=, BETWEEN)、複合索引部分欄位查詢、非唯一索引查詢
  • Index Full Scan: 查詢資料全可從索引取得,結果有序
  • Index Fast Full Scan: 類似 Full Scan 但不排序,多區塊讀取,效率更高

三、三大經典連接演算法

連接類型運作原理適用場景與特點
Sort Merge Join (SMJ)分別對驅動表與被探查表連接鍵排序,再合併排序耗資源,大表通常非最佳。若兩表預先排序則效率佳
Nested Loops (NL)驅動表每列逐一比對被探查表所有列可先回傳已連接列,實現快速回應時間。適合小結果集、OLTP
Hash Join較小行源建 Hash Table/Bitmap,較大行源探查匹配Hash Table 能置於記憶體時極高效。需設 `hash_area_size`,僅支援等值連接

四、特殊情況:Cartesian Product (笛卡爾積)

無連接條件或條件失效時發生,每列與另一表所有列比對,效能極差,通常為 SQL 撰寫錯誤或統計資訊過期導致。

調優實務提示

  1. 優先檢查驅動表選擇是否正確(小結果集驅動大表)
  2. 確認連接鍵欄位是否有適當索引
  3. 觀察 `Rows`、`Cost`、`Bytes` 預估值與實際是否偏差過大(統計資訊問題)
  4. 善用 `/*+ LEADING(t1 t2) USE_NL(t2) */` 等 Hint 強制連接順序與方法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved