Vérifier l'état du bind peeking et de l'adaptive cursor sharing
OraclePerformancesCommande
-- 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>';Ce que fait la commande
L'optimiseur choisit un plan en examinant la valeur de bind lors du premier hard parse. L'adaptive cursor sharing peut créer des child cursors/plans différents par valeur de bind sur les colonnes avec histogrammes ; ces requêtes montrent si le curseur est bind-sensitive/aware, quelle valeur a été examinée et pourquoi des enfants ont été créés.
Quand l'utiliser
Pour les plaintes du type "le même SQL est parfois rapide, parfois lent", avec une distribution de données asymétrique, et lorsque le nombre de child cursors explose (high version count).
Attention
Aucune licence requise ; lecture seule. V$SQL_BIND_CAPTURE est échantillonné (environ toutes les 15 minutes par défaut) et ne contient que les binds WHERE/HAVING ; ce n'est pas la valeur de chaque exécution. ACS ne rend un curseur bind-aware qu'après quelques mauvaises exécutions. Pour les SQL critiques, charger plusieurs plans dans une SQL plan baseline est plus déterministe que de compter sur ACS.
Voir aussi
- Prendre un snapshot AWR et générer un rapport AWR entre deux snapshots
- Rapport AWR diff (compare period) entre deux périodes
- Principaux événements d'attente et principaux SQL depuis ASH pour les dernières minutes
- Lancer une analyse ADDM et obtenir son rapport
- Obtenir un rapport SQL Monitor (SQL long en cours ou terminé)
- Activer/désactiver la trace 10046 pour une session et la résumer avec TKPROF