bind peeking 및 adaptive cursor sharing 상태 확인
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>';하는 일
옵티마이저는 첫 hard parse 시 bind 값을 엿보고(peek) 계획을 선택한다. adaptive cursor sharing은 히스토그램이 있는 컬럼에서 bind 값별로 다른 child cursor/계획을 만들 수 있다. 이 쿼리들은 커서가 bind-sensitive/aware인지, 어떤 값이 peek되었는지, child가 왜 생성되었는지 보여 준다.
사용 시점
"같은 SQL이 어떤 때는 빠르고 어떤 때는 느리다"는 불만, 치우친 데이터 분포, child cursor 수가 폭증할 때(high version count).
주의
라이선스가 필요 없으며 읽기 전용이다. V$SQL_BIND_CAPTURE는 샘플링되며(기본적으로 약 15분마다) WHERE/HAVING bind만 보관하므로 모든 실행의 값이 아니다. ACS는 몇 번의 나쁜 실행 후에야 커서를 bind-aware로 만든다. 중요 SQL에는 ACS에 의존하기보다 여러 계획을 SQL plan baseline에 로드하는 것이 더 결정적이다.