Mittwoch, Oktober 17, 2012

Global Temporary Tables und CTAS

Temporäre Tabellen gehören nicht zu den Objekten, über die ich mir allzu häufig Gedanken mache. Gestern habe ich allerdings ein recht interessantes Verhalten beobachtet, das ich in Zukunft einsetzen kann, wenn ich nicht möchte, dass die Datenbank anfängt sich zu langweilen:

create global temporary table test_mpr
as
select rownum rn
     , lpad('*', 50, '*') col1
  from dual
connect by level <= 1000000;

Tabelle wurde erstellt.

select count(*)
  from test_mpr;

  COUNT(*)
----------
         0

Auf die Idee, eine temporäre Tabelle über CTAS zu befüllen, wäre ich allein nie gekommen, aber das Ergebnis ist interessant. Ein Blick in v$sql zeigt, dass tatsächlich 1M rows erzeugt wurden, die aber nach Abschluss der Operation nicht mehr verfügbar sind. In v$sesstat sieht man allerdings, dass die Anzahl der user commits durch die CTAS-Operation um 1 erhöht wurde. Demnach wird die temporäre Tabelle also gefüllt, aber durch das implizite COMMIT am Ende der CTAS-Operation gleich wieder geleert. Um die Sätze zu erhalten benötigt man folglich eine temporäre Tabelle mir der ON COMMIT PRESERVE ROWS-Option:

create global temporary table test_mpr
on commit preserve rows
as
select rownum rn
     , lpad('*', 50, '*') col1
  from dual
connect by level <= 1000000;

Tabelle wurde erstellt.

select count(*)
  from test_mpr;

  COUNT(*)
----------
   1000000

Keine Kommentare:

Kommentar veröffentlichen