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

SQL 調優實戰(二):執行計劃核心觀念、存取路徑與連接演算法深度解析

     編輯:Oracle 資料庫基礎

核心背景知識

共享 SQL 與游標共享

Oracle 將 SQL 文本與執行計劃缓存於 SGA 共用池。共享條件極嚴格:

  1. 文本哈希值相同
  2. 文本完全一致(含大小寫、空白、註解)
  3. 引用物件同一(同 Schema 或同義詞指向同一物件)
  4. 綁定變數名稱與類型一致

硬編碼 SQL(字面值)導致無法共享。Oracle 8i 引入 CURSOR_SHARING 參數(預設 EXACT),設為 FORCE 可將字面值自動轉為綁定變數,但可能引發性能退化,**建議開發階段直接使用綁定變數**。

ROWID 概念

  • 偽列,系統自動維護,不可修改/刪除
  • 單行最快存取路徑:直接定位 Data Block
  • 索引儲存 (索引鍵值, ROWID),索引查詢 = 索引掃描取 ROWID → TABLE ACCESS BY ROWID
  • Oracle 8 起 ROWID = OBJECT + FILE + BLOCK + ROW NUMBER,可用 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 後執行。

兩類父節點啟動機制:

  • 單行觸發: 表存取、索引存取、Nested Loops、Filter —— 子節點返回一行即啟動,適合 FIRST_ROWS 目標
  • 全行觸發: Sort、Sort Merge Join、Group By、聚合函數 —— 需所有行就緒才執行,適合 ALL_ROWS 目標

五大存取路徑

  1. Full Table Scan (FTS): 讀取 HWM 以下所有 Block,多區塊讀(db_file_multiblock_read_count),資料置於 LRU 尾部。適用:小表、需讀取 >5-10% 資料、並行查詢。
  2. TABLE ACCESS BY ROWID: 單區塊讀,最快單行存取。ROWID 來自 WHERE 條件或索引掃描。
  3. Index Unique Scan: 唯一索引查找單一 ROWID(含組合索引含 Leading Column 且返回單行)。
  4. Index Range Scan: 索引讀取多行(唯一索引用範圍運算子、組合索引部分欄位、非唯一索引任意查詢)。
  5. Index Full Scan / Fast Full Scan: CBO 判斷掃描索引優於掃描表時使用。Fast Full Scan 可多區塊讀、並行、不排序。

三大連接演算法

演算法 核心機制 適用場景 關鍵參數
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 流向、存取路徑選擇邏輯、連接演算法適用邊界,是閱讀執行計劃並精準調優的基石。下一篇將示範如何獲取與分析真實執行計劃。

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