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

從一條 SELECT 看 Oracle 查詢處理全流程:解析、優化、執行與快取

     編輯:Oracle 資料庫基礎

整體流程圖

Client Process → Network → Server Process → Parse → Optimize → Execute → Fetch → Return
                    ↑                                              ↓
              Shared Pool (Library Cache) ←──────────────────────┘

階段一:客戶端發送

  • Client Process (sqlplus/JDBC/OCI) 封裝 SQL 送至 Listener
  • Listener 轉交 Dedicated/Shared Server Process
  • 關鍵:Client 不執行任何邏輯,純網路傳輸

階段二:解析 - 核心六步驟

  1. 語法檢查:關鍵字、標點、結構正確性
  2. 語義檢查:物件存在、欄位正確、權限 (Dictionary Cache)
  3. 共享游標查找:Library Cache 中尋找完全相同 SQL (含空白、大小寫、註解)
    • 命中 → Soft Parse,直接執行
    • 未命中 → Hard Parse,繼續下步
  4. 物件鎖定:Library Cache Lock/Pin 防止 DDL 衝突
  5. 優化器生成執行計畫:
    • RBO (Rule-based) - 已棄用
    • CBO (Cost-based) - 依統計資訊估算成本
  6. 存入 Library Cache:SQL 文本、解析樹、執行計畫

Hard Parse vs Soft Parse

指標Hard ParseSoft Parse
CPU高極低
Latch 爭用Library Cache Latch幾乎無
共享池壓力大小

⚡ 使用 Bind Variable 最大化 Soft Parse!

階段三:優化器 (CBO) 運作

  1. 收集統計資訊:表/索引/欄位/系統統計
  2. 轉換查詢:View Merging、Subquery Unnesting、Predicate Pushdown
  3. 生成候選計畫:Access Path (Full Scan/Index/Partition)、Join Method (NL/HJ/SM)、Join Order
  4. 成本模型評估:I/O + CPU + Network 成本
  5. 選擇最低成本計畫

階段四:執行

  • 依計畫逐步操作:Table Access、Index Scan、Join、Sort、Aggregation
  • PGA 分配排序/雜湊區
  • Buffer Cache 讀取/修改區塊
  • Redo Log Buffer 記錄變更

階段五:提取

  • Array Fetch (預設 15 行/批次,可調 ARRAYSIZE)
  • 網路傳輸回 Client

實戰優化檢查清單

階段常見問題解決方案
解析Hard Parse 暴增Bind Variable、CURSOR_SHARING、增加 Shared Pool
優化計畫錯誤 (Full Scan 應走 Index)收集統計、Histograms、Hint、SQL Profile、Baseline
執行PGA 不足導致 Temp 磁碟排序調大 PGA_AGGREGATE_TARGET、優化 SQL 邏輯
提取網路往返過多增加 ARRAYSIZE、減少選取欄位、壓縮傳輸

診斷工具

  • EXPLAIN PLAN / DBMS_XPLAN.DISPLAY_CURSOR
  • V$SQL, V$SQL_PLAN, V$SQLSTATS
  • 10046 Trace (Extended SQL Trace) + TKPROF
  • SQL Monitoring (11g+) DBMS_SQLTUNE.REPORT_SQL_MONITOR
  • AWR/ASH 報告
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved