DBAtlas · 데이터베이스 운영 아틀라스

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에 로드하는 것이 더 결정적이다.

DBAtlas에서 열기 →

관련 항목