自 Oracle 9i 起,優化器在解析 SQL 時會「窺探」首次執行時的綁定變量實際值,以生成最優執行計劃。此功能對於數據傾斜場景極其有用,能根據實際值選擇索引或全表掃描。
查詢參數當前值:
SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc DESCRIPTION
FROM sys.x$ksppi x, sys.x$ksppcv y
WHERE x.inst_id = USERENV('Instance')
AND y.inst_id = USERENV('Instance')
AND x.indx = y.indx
AND x.ksppinm LIKE '%peek%';
輸出範例:
NAME VALUE DESCRIPTION
------------------------- ---------- ------------------------------
_optim_peek_user_binds TRUE enable peeking of user binds
| 值 | 行為 | 適用場景 |
|---|---|---|
| TRUE (預設) | 啟用窺探 | 數據分布均勻、首次執行值具代表性 |
| FALSE | 禁用窺探 | 嚴重數據傾斜、首次值極不典型、計劃穩定性優先 |
修改方式 (需重啟實例生效):
ALTER SYSTEM SET "_optim_peek_user_binds"=FALSE SCOPE=SPFILE;
-- 或在 init.ora / spfile 中添加
_optim_peek_user_binds=FALSE
OPT_PARAM('_optim_peek_user_binds','FALSE') Hint 單獨控制該 SQL。DBMS_STATS.SET_TABLE_PREFS 設定 METHOD_OPT 針對傾斜欄位收集直方圖。Bind Peeking 是把雙面刃。預設開啟利於大多數場景,但在嚴重傾斜且首次值不具代表性時,可考慮關閉或升級至 11g+ 利用 ACS 機制自動處理。