Oracle統計信息收集時的鎖持有階段
1 準備階段(共享模式鎖)
鎖類型:對象級共享鎖(S鎖)
持續時間:通常1-5秒
主要操作:
- 驗證對象存在性和權限
- 檢查統計信息首選項設置
- 確定采樣方法和并行度
監控方法:
SELECT * FROM v$session_wait
WHERE sid = [收集會話SID]
AND wait_class != 'Idle';
2 數據采樣階段(行級鎖)
鎖類型:行級排他鎖(TX鎖)
特點:
- 僅在被采樣的行上短暫持有
- 鎖持續時間與采樣方法相關:
- 全表掃描:幾乎不持有行鎖
- 隨機采樣:每采樣行約1-10毫秒
規避策略:
BEGINDBMS_STATS.SET_TABLE_PREFS('SCHEMA', 'TABLE', 'METHOD_OPT', 'FOR ALL COLUMNS SIZE AUTO');
END;
3 統計計算階段(無持久鎖)
特點:
- 純CPU計算過程
- 僅持有內存中的臨時結構
- 可能短暫獲取library cache latch
資源消耗:
-- 監控CPU使用
SELECT * FROM v$sysmetric
WHERE metric_name = 'CPU Usage Per Sec'
AND group_id = 2;
4 數據字典更新階段(排他鎖)
鎖類型:數據字典排他鎖(X鎖)
關鍵操作:
- 更新SYS.TAB_STATS$等基表
- 修改USER_TAB_STATISTICS等視圖數據
- 持續時間通常<100ms
優化建議:
-- 使用NO_INVALIDATE減少鎖影響范圍
BEGINDBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCHEMA',tabname => 'TABLE',no_invalidate => FALSE);
END;
5 游標失效階段(庫緩存鎖)
鎖類型:library cache lock/pin
行為特點:
- 使依賴該表統計信息的游標失效
- 可能引發硬解析風暴
- 持續時間與依賴游標數量成正比
監控方法:
SELECT * FROM v$librarycache
WHERE namespace = 'SQL AREA';
各版本差異對比
版本 | 鎖優化改進 | 影響階段 |
---|---|---|
11gR2 | 引入增量統計收集 | 減少數據字典更新鎖時間 |
12c | 默認并發收集 | 縮短整體鎖持有時間 |
19c | 持久化統計信息設置 | 減少重復收集鎖爭用 |
21c | 自動異步統計收集 | 完全避免業務時段鎖爭用 |