Freitag, August 19, 2011

DBMS_XPLAN in RAC-Datenbanken

Dieser Tage habe ich in Jonathan Lewis' Blog eine Frage nach der Verwendbarkeit von dbms_xplan.display_cursor in RAC-Systemen gestellt, aber zunächst nur einen kurzen Kommentar von Dom Brooks dazu bekommen. Da sich im Thread neben dem Herrn Lewis auch noch die Herren Geist und Rahn aufgehalten haben, hoffe ich darauf, dass da vielleicht noch weitere Bemerkungen folgen. Für's erste aber noch mal meine Beobachtungen:

Beim Versuch, in einer RAC-Datenbank den Zugriffsplan für eine über gv$sql ermittelte sql_id mit Hilfe von dbms_xplan.display_cursor anzeigen zu lassen, bekomme ich kein Ergebnis:

select *
  from table(dbms_xplan.display_cursor(sql_id => '13x0qwkc4xrfv', cursor_child_no=>1));
 
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------
SQL_ID: 13x0qwkc4xrfv, child number: 1 cannot be found

In v$sql_plan sehe ich auch keine zugehörigen Einträge, aber in gv$sql_plan finden sich die gesuchten Informationen:

select count(*)
  from v$sql_plan
 where sql_id = '13x0qwkc4xrfv'
   and child_number = 1;
 
  COUNT(*)
----------
         0
 
select count(*)
  from gv$sql_plan
 where sql_id = '13x0qwkc4xrfv'
   and child_number = 1;
 
  COUNT(*)
----------
         4

Offenbar greift dbms_xplan.display_cursor nicht auf die gv$-Views zu: in einer anderen Datenbank (kein RAC), sehe ich über Event 10046 nur rekursive Zugriffe auf v$-Views:

select /* EXEC_FROM_DBMS_XPLAN */ case when upper(sql_text) like
  '%DBMS_XPLAN%' then 0 else 1 end case, SQL_ID, child_number
from
 v$sql where SQL_ID ='8szmwam7fysa3' and child_number =0
 
...
 
Parsing user id: 68     (recursive depth: 1)
 
Rows     Row Source Operation
-------  ---------------------------------------------------
      1  FIXED TABLE FIXED INDEX X$KGLCURSOR_CHILD (ind:2) (cr=0 pr=0 pw=0 time=0 us cost=0 size=536 card=1)

Das entspricht auch den Angaben der Doku: "The table function DISPLAY_CURSOR requires to have select privileges on the following fixed views: V$SQL_PLAN, V$SESSION and V$SQL_PLAN_STATISTICS_ALL". Im Widerspruch dazu scheint mir der entsprechende Eintrag in Morgan's Library zu sein: "Display from GV$SQL_PLAN (or GV$SQL_PLAN_STATISTICS_ALL)."

Meiner Meinung nach wäre es günstig, wenn dbms_xplan.display_cursor einen NODE-Parameter beinhalten würde, da die Plan-Informationen über gv$_sql_plan ja offenbar verfügbar wären.

Nachtrag 31.08.2011: in einem Kommentar im Sratchpad wurde ein funktionierender Workaround vorgeschlagen, der die Anzeige der Pläne von anderen Knoten ermöglicht:
select * 
  from table(dbms_xplan.display('gv$sql_plan_statistics_all'
                               , null
                               , null
                               , 'inst_id = &inst_id and sql_id = ''&sql_id'' and child_number = &child_number')
             );

Keine Kommentare:

Kommentar veröffentlichen