Проверить 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-переменной. Adaptive cursor sharing может создавать разные дочерние курсоры/планы для разных значений bind на столбцах с гистограммами; эти запросы показывают, является ли курсор bind-sensitive/aware, какое значение было подсмотрено и почему создавались дочерние курсоры.
Когда использовать
При жалобах "один и тот же SQL то быстрый, то медленный", при неравномерном распределении данных и при взрывном росте числа дочерних курсоров (high version count).
Внимание
Лицензия не требуется; только чтение. V$SQL_BIND_CAPTURE заполняется выборочно (по умолчанию примерно раз в 15 минут) и содержит только bind из WHERE/HAVING; это не значение каждого выполнения. ACS делает курсор bind-aware лишь после нескольких неудачных выполнений. Для критичных SQL загрузка нескольких планов в SQL plan baseline более детерминирована, чем расчёт на ACS.
Связанные материалы
- Сделать снимок AWR и сформировать отчёт AWR между двумя снимками
- Отчёт AWR diff (compare period) между двумя периодами
- Топ wait events и топ SQL из ASH за последние минуты
- Выполнить анализ ADDM и получить отчёт
- Получить отчёт SQL Monitor (выполняющийся или завершённый долгий SQL)
- Включить/выключить трассировку 10046 для сессии и обобщить её через TKPROF