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

Oracle Shared Pool 調優核心指標與實戰策略:Gethitratio、Reloads/Pins、Reserved Pool、大物件鎖定 (DBMS_SHARED_POOL.KEEP)

     編輯:Oracle 資料庫基礎

為何優先調優 Shared Pool?

Shared Pool Miss (硬解析) 成本遠高於 Buffer Cache Miss (物理讀)。Library Cache (SQL/PLAN) 變動頻繁,Dictionary Cache 相對穩定,**關鍵在 Library Cache**。

核心監控指標與閾值

指標查詢 SQL健康閾值異常處理
SQL Area GethitratioSELECT gethitratio FROM v$librarycache WHERE namespace='SQL AREA';> 90% (理想 > 95%)檢查應用是否使用綁定變數、CURSOR_SHARING
Reloads / Pins (Library Cache Miss Rate)SELECT SUM(pins) execs, SUM(reloads) misses, SUM(reloads)/SUM(pins) ratio FROM v$librarycache;< 1%1) 增加 SHARED_POOL_SIZE 2) 檢查無效物件導致重解析
Dictionary Cache Miss RateSELECT SUM(getmisses)/SUM(gets) FROM v$rowcache;總計 < 15%,單項 < 2%間接調大 SHARED_POOL_SIZE (無獨立參數)
Reserved Pool 使用率SELECT * FROM v$shared_pool_reserved;FREE_MEMORY > 50% 或 REQUEST_MISSES=0/不增長過大則壓縮 (Reserved Pool = 10% Shared Pool,上限 50%)

實戰調優策略

1. 將大型匿名 PL/SQL 區塊拆解為「小區塊 + 存儲過程」

大型匿名區塊佔用大量 Shared Pool、易造成碎片。拆解後小區塊調用存儲過程,存儲過程可被 KEEP 鎖定。

2. 9i+ 新功能:Execution Plan 共存 Library Cache

V$SQL_PLAN 可直接查看計劃,利於診斷。善用 DBMS_XPLAN.DISPLAY_CURSOR。

3. 鎖定常用大物件防止被淘汰 (關鍵技巧)

大物件 (Package/Procedure/Trigger/Sequence) 一旦被淘汰,重載成本高、且 Sequence 可能導致號碼跳號。

查找未鎖定的大物件


SELECT owner, name, type, sharable_mem
FROM v$db_object_cache
WHERE sharable_mem > 10000  -- > 10KB
  AND type IN ('PACKAGE','PROCEDURE','FUNCTION','PACKAGE BODY','TRIGGER','SEQUENCE')
  AND kept = 'NO'
ORDER BY sharable_mem DESC;

鎖定物件


EXEC DBMS_SHARED_POOL.KEEP('SCHEMA.PACKAGE_NAME');
EXEC DBMS_SHARED_POOL.KEEP('SCHEMA.TRIGGER_NAME');
EXEC DBMS_SHARED_POOL.KEEP('SCHEMA.SEQUENCE_NAME');

對應腳本:$ORACLE_HOME/rdbms/admin/dbmspool.sql。

4. 偵測並處理過大匿名 PL/SQL 區塊


-- 找出超過 500 字元的匿名區塊 (COMMAND_TYPE=47)
SELECT sql_text FROM v$sqlarea
WHERE command_type = 47 AND LENGTH(sql_text) > 500;

處理方案:A) 拆解為存儲過程 B) 若必須保留,執行 DBMS_SHARED_POOL.KEEP 鎖定 (需先轉為 Cursor)。

5. 監控碎片與 ORA-04031


-- 可用塊大小分布
SELECT KSMCHCLS CLASS, COUNT(*), SUM(KSMCHSIZ) TOTAL_BYTES, MAX(KSMCHSIZ) MAX_CHUNK
FROM X$KSMSP
WHERE KSMCHCLS IN ('free','R-free','perm','R-perm')
GROUP BY KSMCHCLS;

R-free (Reserved Free) 不足易觸發 ORA-04031。調大 SHARED_POOL_RESERVED_SIZE (隱含參數 _SHARED_POOL_RESERVED_PCT,預設 5%)。

常見誤區

  • 單純調大 SHARED_POOL_SIZE:若應用不使用綁定變數,大 Pool 只會延緩 ORA-04031,根治需修正程式碼。
  • 忽略 CURSOR_SHARING:舊系統無法改代碼時,ALTER SYSTEM SET CURSOR_SHARING=FORCE 可緩解,但可能導致計劃不穩,需測試。
  • 未鎖定 Sequence:Sequence 被淘汰後重載會重新產生緩存值,導致號碼跳號 (非連續),業務若要求連續必須鎖定或用 NOCACHE。

自動化巡檢腳本邏輯


# 每小時執行
hit_ratio = query("SELECT gethitratio FROM v$librarycache WHERE namespace='SQL AREA'")
if hit_ratio < 0.90: alert("Library Cache Hit Ratio 低於 90%")

miss_rate = query("SELECT SUM(reloads)/SUM(pins) FROM v$librarycache")
if miss_rate > 0.01: alert("Reloads/Pins 超過 1%")

dict_miss = query("SELECT SUM(getmisses)/SUM(gets) FROM v$rowcache")
if dict_miss > 0.15: alert("Dictionary Cache Miss Rate 超過 15%")

reserved = query("SELECT free_space, request_misses FROM v$shared_pool_reserved")
if reserved.free_space < reserved.total_space * 0.5: alert("Reserved Pool 空閒低於 50%")
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved