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

Oracle 執行計劃核心概念與存取路徑、連接機制深度解析

     編輯:Oracle 資料庫基礎

基礎術語釐清

術語定義
Rowid偽列,唯一標識行物理位置(檔號、區塊、槽位),生命週期不變(含遷移列)。
Recursive SQL執行使用者 SQL 時內部衍生的遞迴呼叫(如 DDl 修改字典、字典快取未命中),使用者無感知。
Row Source操作產出的符合條件行集合:全表、篩選後子集、或連接後結果。
PredicateWHERE 條件限制。
Driving Table (Outer)嵌套循環/雜湊連接的外層輸入,宜為套用條件後行數較少者(非絕對小表)。
Probed Table (Inner)內層輸入,通常為大表且連接鍵有索引。
Concatenated Index多欄組合索引,引導欄為首欄;條件必含引導欄才能使用索引。
Selectivity唯一值數/總行數,越接近 1 越適合建索引、用索引。

資料存取路徑詳解

1. 全表掃描 (FTS)

  • 多區塊讀 (db_file_multiblock_read_count) 降低 I/O 次數。
  • 適用:小表、需讀取 >5-10% 資料、並行查詢。

2. ROWID 存取

  • 單區塊讀,定位最快,常配合索引掃描使用。

3. 索引掃描四類型

類型觸發條件特徵
Index Unique Scan唯一索引 + 等值條件回傳單一 ROWID,最輕量。
Index Range Scan唯一索引+範圍條件、組合索引前導欄不全、非唯一索引回傳多 ROWID,資料已排序可省 ORDER BY。
Index Full Scan需索引所有欄位、且查詢欄位全在索引中掃描全部索引葉區塊,單區塊讀,資料有序。
Index Fast Full Scan查詢欄位全在索引中、不需排序多區塊讀、可並行、不保證順序,吞吐量最大。

覆蓋索引優勢:查詢欄位全在索引中可避免 TABLE ACCESS BY ROWID,省去隨機 I/O。

三大連接機制對比

連接類型核心流程適用場景優/缺點
Sort Merge Join (SMJ)兩邊各自排序 → 合併非等值連接、雙方已預排序(索引)、大表連接排序耗資源;預排序時極快;可並行讀取/排序。
Nested Loops (NL)Outer 逐行 Probe Inner(通常走索引)Outer 小且 Inner 有高選擇性索引、需快速回應首筆資料可管道式輸出首筆行;Outer 選錯效能災難;並行查詢常用大表作 Outer。
Hash Join (HJ)Build Hash Table(Bitmap) from smaller → Probe larger等值連接、CBO、大表連接、Hash Table 能置於記憶體理論最快;需 HASH_JOIN_ENABLED=TRUE 與足夠 hash_area_size;僅支援等值連接。

笛卡兒積:無連接條件導致,極少數情況(如星狀查詢維度表)刻意使用,否則為 Bug。

連接順序與驅動表選擇

  • 優化器優先套用 WHERE 條件縮減 Row Source,再決定連接順序。
  • 大表若有高選擇性過濾條件,亦可作 Driving Table。
  • 並行查詢傾向選大表作 Driving Table 以發揮並行度。

總結

掌握存取路徑與連接機制的觸發條件、資料量門檻、索引覆蓋與排序特性,是讀懂執行計劃、進行 SQL 調優的基石。實戰中結合 EXPLAIN PLAN、DBMS_XPLAN 觀察實際 Row Source 統計資訊,才能精準診斷瓶頸。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved