DBAtlas · Atlas für Datenbankbetrieb

Status von Bind Peeking und Adaptive Cursor Sharing prüfen

OraclePerformance

Befehl

-- 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>';

Was es tut

Der Optimizer wählt beim ersten Hard Parse einen Plan, indem er auf den Bind-Wert schaut (Peeking). Adaptive Cursor Sharing kann bei Spalten mit Histogrammen je Bind-Wert unterschiedliche Child Cursors/Pläne erzeugen; diese Abfragen zeigen, ob der Cursor bind-sensitive/-aware ist, welcher Wert gepeekt wurde und warum Children entstanden sind.

Wann einsetzen

Bei Beschwerden wie "dieselbe SQL ist mal schnell, mal langsam", bei schiefer Datenverteilung und wenn die Zahl der Child Cursors explodiert (hoher Version Count).

Vorsicht

Keine Lizenz erforderlich; nur lesend. V$SQL_BIND_CAPTURE wird stichprobenartig erfasst (standardmäßig etwa alle 15 Minuten) und enthält nur WHERE-/HAVING-Binds; es ist nicht der Wert jeder Ausführung. ACS macht einen Cursor erst nach einigen schlechten Ausführungen bind-aware. Für kritische SQL ist das Laden mehrerer Pläne in eine SQL Plan Baseline deterministischer als sich auf ACS zu verlassen.

In DBAtlas öffnen →

Verwandte Einträge