Hallo:
ich kann nicht herausfinden, warum einige SQL-Statements sich einen shared_cursor nicht teilen und einen weiteren Cursor aufmachen, obwohl eine Version schon im Speicher ist.
In der V$SQLAREA sehe ich für ein sql-statement (das von der Applikation herkommt)
folgende Information angezeigt:
VERSION\_COUNT = 18
EXECUTIONS = 32479
PARSE\_CALLS = 32421
USERS\_OPENING = 9
LOADS = 23
INVALIDATIONS = 2
(auch wenn es hierbei nur wenige Versionen im Verhältnis zu den EXECs sind, dies ist nur ein Beispiel)
Wenn ich mir nun die v$sql_shared_cursor anschaue, gibt er mir für die 18 Versionen 3 Mismatch-Typen aus:
BIND\_MISMATCH
USER\_BIND\_PEEK\_MISMATCH
ROLL\_INVALID\_MISMATCH
Bei „USER_BIND_PEEK_MISMATCH“ habe ich gelesen, dass, wenn der Wert de Bindvariable
eine potentielle Änderung im Execution-Plan bewirkt. Dies leuchtet mir ein und akzeptiere ich so.
Was mir noch ein Rätsel ist, ist die Bedeutung von „ROLL_INVALID_MISMATCH“.
Dieses Feld hat in allen meinen 18 Versionen ein „Y“.
„BIND_MISMATCH“ glaubte ich verstanden zu haben (änderung der Bind-Metadaten),
bin mir nicht sicher, ob es noch andere Fälle gibt, bei denen hier ein Flag gesetzt wird .
Ich machte einen kleinen Test, der durch Ändern der Variablen-Definition
einen Bind-Mismatch hevorrufte:
--------------------------------------------------------
var a1 varchar2(10);
var a2 varchar2(10);
exec :a1:='Y'; :a2:='P';
Select \* from tab1 where feld1= :a1 and feld2 = :a2;
var a1 varchar2(50);
var a2 varchar2(10);
exec :a1:='Y'; :a2:='P';
Select \* from tab1 where feld1= :a1 and feld2 = :a2;
---------------------------------------------------------
=> Dadurch habe ich 2 Einträge in v$SQL_SHARED_CURSOR
mit einem „Y“ in BIND_MISMATCH erzeugt.
In meinem kl. Test kenne ich den „Programm-Code“, nun habe ich aber eine Applikation in meiner DB, dessen Code ich nicht kenne (SIEBEL),
möchte aber trotzdem wissen, warum ein neuer „Child“ erstellt wird und de ursprüngliche
Cursor nicht wierdefverwendet wird.
In V$sql_plan vergleiche ich das Feld „projection“ mit 2 meiner Versionen,
die mir ein Bind-Mismatch anzeigen, aber die Feldtypen sind absolut gleich definiert.
Schaue ich im richtigen Feld nach oder finde ich die Information woanders?
Wo findet der Optimizer die Information, dass sich die Bind-Metadaten geändert haben?
viele Grüsse
Regine