バインドピークと適応カーソル共有の状態を確認
Oracleパフォーマンスコマンド
-- 1) Child cursors: bind-sensitive / bind-aware / shareable?
SELECT sql_id, child_number, executions, plan_hash_value,
is_bind_sensitive, is_bind_aware, is_shareable,
ROUND(buffer_gets/NULLIF(executions,0)) AS gets_per_exec
FROM v$sql
WHERE sql_id = '<sql_id>'
ORDER BY child_number;
-- 2) ACS histogram and selectivity ranges:
SELECT child_number, bucket_id, count
FROM v$sql_cs_histogram
WHERE sql_id = '<sql_id>'
ORDER BY child_number, bucket_id;
SELECT child_number, predicate, range_id, low, high
FROM v$sql_cs_selectivity
WHERE sql_id = '<sql_id>';
-- 3) Peeked / captured bind values:
SELECT child_number, name, position, datatype_string, value_string,
TO_CHAR(last_captured,'YYYY-MM-DD HH24:MI:SS') AS captured
FROM v$sql_bind_capture
WHERE sql_id = '<sql_id>'
ORDER BY child_number, position;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('<sql_id>', NULL, 'TYPICAL +PEEKED_BINDS'));
-- 4) Why was a new child created?
SELECT child_number, bind_mismatch, bind_equiv_failure,
optimizer_mismatch, load_optimizer_stats
FROM v$sql_shared_cursor
WHERE sql_id = '<sql_id>';概要
オプティマイザは最初のハード解析時にバインド値をピークして計画を選択する。適応カーソル共有は、ヒストグラムのある列でバインド値ごとに異なる子カーソル/計画を作成できる。これらのクエリで、カーソルがbind-sensitive/awareか、どの値がピークされたか、子カーソルが作成された理由を表示する。
使用する場面
「同じSQLが速いときと遅いときがある」という苦情、偏ったデータ分布、子カーソル数の急増(高いバージョン数)に。
注意
ライセンス不要、読み取り専用。V$SQL_BIND_CAPTUREはサンプリング(デフォルトで約15分ごと)であり、WHERE/HAVINGのバインドのみを保持する。すべての実行の値ではない。ACSは数回の悪い実行の後にのみカーソルをbind-awareにする。重要なSQLでは、ACSに頼るよりSQL計画ベースラインに複数の計画をロードする方が確実。