Oracle Shared Pool 核心概念
Oracle Shared Pool 是系統全域區(SGA)的關鍵組件,主要負責緩存 SQL 執行計劃、PL/SQL 程式碼、資料字典資訊等可共享的記憶體結構。理解其運作機制對於資料庫效能調校至關重要。
用戶連接與服務器進程模式
專用服務器模式
在專用服務器架構下,監聽進程接收用戶請求後有兩種處理方式:
- HAND-OFF 連接(轉換連接):監聽進程生成新的專用服務器進程,將控制資訊傳遞給新進程,由新進程直接與用戶通訊。此模式需要作業系統支援進程繼承功能,Windows 平台需設定
USE_SHARED_SOCKET 登錄值。
- 重定向連接:服務器進程選擇一個 TCP/IP 端口,將端口資訊回傳給監聽進程,再由監聽轉交給用戶進程,用戶直接連接該端口。
共享服務器模式
僅支援重定向連接。監聽進程生成調度進程,多個用戶請求排隊於有限的調度進程,再由共享服務器進程從統一請求隊列取出處理。處理完成後,結果放入對應調度進程的響應隊列返回給用戶。可透過 MAX_DISPATCHERS 和 SHARED_SERVERS 參數控制調度與共享服務器進程數量。
SQL 語句解析與執行流程
當用戶提交 SQL 語句(如 UPDATE TABLEA SET SALARY=SALARY*2),服務器進程執行以下步驟:
- 語法檢查:驗證 SQL 語法正確性
- 語義檢查:對照資料字典檢查物件存在性、用戶權限等
- 檢查失敗返回 ORA-錯誤碼,不區分語法或語義錯誤
- 通過後,將語句轉換為 ASCII 碼,經 Hash 函數產生 Hash 值
- 在 Shared Pool 的 Library Cache 中查找相同 Hash 值:
- 軟解析:找到匹配,直接使用已緩存的解析樹與執行計劃
- 硬解析:未找到,需進行優化(生成執行計劃)並產生編譯代碼
Library Cache 關鍵指標解讀
透過 V$LIBRARYCACHE 監控 Shared Pool 健康度:
- Pins (Execution):SQL 實際執行次數,不含語法/語義檢查失敗的語句
- Reloads (Parse):未找到相同 Hash Value 的次數,即硬解析次數
- Invalidations (Parse):因物件變更導致緩存失效而必須重新硬解析的次數。DDL 操作會立即使相關執行計劃失效,
V$SQL 中的 PLAN_HASH_VALUE 立即歸零,再次執行時重新計算
鎖存器與並發控制
服務器進程透過 Shared Pool 鎖存器申請緩存空間,被鎖定的 PL/SQL 區塊不可被覆蓋。SQL 解析階段使用 Library Cache 鎖存器;讀取資料字典時也需 Library Cache 鎖存器保護字典緩存區域。