Temporäre Tabellen in DB2 auf IBM i – Effizient, flexibel, unverzichtbar

tiny-tool.de

Temporäre Tabellen sind wahre Alltagshelden auf IBM Power Systems (IBM i, ehemals AS/400). Sie machen komplexe SQL-Operationen schneller, entlasten das Dateisystem und bieten jede Menge Flexibilität. Doch was steckt genau dahinter? Wie unterscheiden sie sich von regulären Tabellen oder CTEs (Common Table Expressions)? Und worauf musst Du achten, wenn Du das Maximum rausholen willst? Dieser Artikel liefert Dir das nötige Know-how – praxisnah, fundiert und mit Blick auf typische IBM i-Szenarien.

Was sind temporäre Tabellen?

Temporäre Tabellen speichern Daten nur während der laufenden Session. Danach verschwinden sie automatisch – ideal für flüchtige Daten und Zwischenstände.

Technisches Fundament

Auf IBM i definierst Du temporäre Tabellen mit DECLARE GLOBAL TEMPORARY TABLE. Sie landen automatisch in der Session-Bibliothek QTEMP, sind vom Systemkatalog abgekoppelt und können mit NOT LOGGED besonders performant betrieben werden.

„The DECLARE GLOBAL TEMPORARY TABLE statement defines a temporary table for the current application process. […] Its description does not appear in the system catalog.“ IBM Docs

Ein einfaches Beispiel für die Definition:

DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_EMP (
    EMPNO CHAR(6) NOT NULL,
    SALARY DECIMAL(10, 2),
    DEPTNO CHAR(3)
) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;

In diesem Fall hält die Tabelle z. B. Gehaltsdaten für eine temporäre Analyse vor. WITH REPLACE sorgt dafür, dass ein gleichnamiges Objekt überschrieben wird. Die Option ON COMMIT PRESERVE ROWS bewahrt die Daten auch nach Transaktionsende.

Werbung/Advertising

Aromatico

SQL-Beispiele zum Nachbauen

Temporäre Tabelle erstellen

In Db2 for i (DB2/400) werden temporäre Tabellen meist mit dem SESSION-Schema erstellt. Wichtig: QTEMP darf hier nicht verwendet werden.

-- Temporäre Tabelle (nur Struktur, keine Daten)
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_EMP AS (
  SELECT EMPNO, SALARY
  FROM MYLIB.EMPLOYEES
) WITH NO DATA;

CTE für Zwischenergebnisse

Common Table Expressions (CTEs) lassen sich direkt mit einem SELECT kombinieren:

WITH TempSales AS (
  SELECT ORDERID, SUM(AMOUNT) AS TOTAL
  FROM MYLIB.SALES
  GROUP BY ORDERID
)
SELECT * FROM TempSales
WHERE TOTAL > 1000;

CTEs und temporäre Tabellen kombiniert

Für komplexere Abfragen mit mehreren Verarbeitungsschritten kann es sinnvoll sein, CTE-Ergebnisse in eine temporäre Tabelle zu schreiben:

-- 1. Temporäre Tabelle anlegen (Struktur vorbereiten)
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_AVGSAL AS (
  SELECT DEPTNO, DECIMAL(0,2) AS AVG_SAL
  FROM MYLIB.EMPLOYEES
) WITH NO DATA;

-- 2. CTE verwenden und einfügen
INSERT INTO SESSION.TEMP_AVGSAL
WITH Aggregated AS (
  SELECT DEPTNO, AVG(SALARY) AS AVG_SAL
  FROM MYLIB.EMPLOYEES
  GROUP BY DEPTNO
)
SELECT * FROM Aggregated;

TRUNCATE TABLE vs. WITH REPLACE

In DB2 for i (ab Version 7.2) kannst du mit TRUNCATE TABLE alle Zeilen aus einer temporären Tabelle löschen, ohne die Tabellenstruktur zu verändern. Dies ist eine effiziente Alternative zu WITH REPLACE, das die Tabelle löscht und neu erstellt, was mehr Overhead verursacht.
Vorteile von TRUNCATE TABLE:

  • Performance: Schneller als DELETE FROM, da keine einzelnen Zeilendeletionen protokolliert werden.
  • Wiederverwendbarkeit: Die Tabellenstruktur bleibt erhalten, sodass die Tabelle ohne Neudefinition weiterverwendet werden kann.
  • Anwendungsfälle: Ideal in Stored Procedures oder Batch-Jobs, bei denen eine temporäre Tabelle mehrfach mit neuen Daten gefüllt wird.

Beispiel: In einer Stored Procedure, die Verkaufsdaten für mehrere Monate verarbeitet, kann die Tabelle für jeden Monat geleert und wiederverwendet werden:

-- Schritt 1: Temporäre Tabelle erstellen
DECLARE GLOBAL TEMPORARY TABLE SESSION.MONTHLY_SALES (
    MONTH_ID INT,
    TOTAL_SALES DECIMAL(10,2)
) ON COMMIT PRESERVE ROWS NOT LOGGED;

-- Schritt 2: Daten für Januar einfügen
INSERT INTO SESSION.MONTHLY_SALES 
SELECT 1, SUM(AMOUNT) 
FROM MYLIB.SALES 
WHERE ORDER_DATE BETWEEN '2025-01-01' AND '2025-01-31';

-- Schritt 3: Daten verarbeiten (z. B. Bericht erstellen)
SELECT * FROM SESSION.MONTHLY_SALES;

-- Schritt 4: Tabelle für Februar leeren
TRUNCATE TABLE SESSION.MONTHLY_SALES;

-- Schritt 5: Daten für Februar einfügen
INSERT INTO SESSION.MONTHLY_SALES 
SELECT 2, SUM(AMOUNT) 
FROM MYLIB.SALES 
WHERE ORDER_DATE BETWEEN '2025-02-01' AND '2025-02-28';

Vergleich mit WITH REPLACE: Bei WITH REPLACE würde die Tabelle für jeden Monat neu erstellt werden, was zusätzlichen Overhead verursacht:

DECLARE GLOBAL TEMPORARY TABLE SESSION.MONTHLY_SALES (
    MONTH_ID INT,
    TOTAL_SALES DECIMAL(10,2)
) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;

TRUNCATE TABLE ist in diesem Fall effizienter, da die Struktur erhalten bleibt und nur die Daten gelöscht werden.
Expertenmeinung:
„Die Unterstützung für TRUNCATE TABLE in DB2 for i ab Version 7.2 ermöglicht ein effizientes Leeren von temporären Tabellen ohne Strukturänderung.“ – IBM Docs: TRUNCATE.

TRUNCATE und Indizes auf temporären Tabellen

TRUNCATE auf temporären Tabellen

Seit IBM i Version 7.2 unterstützt Db2 for i das Truncating von temporären Tabellen. Mit dem TRUNCATE TABLE-Befehl können alle Zeilen einer DECLARE GLOBAL TEMPORARY TABLE (Session-Tabelle) in einem Schritt gelöscht werden, während die Tabellenstruktur erhalten bleibt. Dies entspricht funktional dem CL-Befehl CLRPFM (Clear Physical File Member) in SQL-Form und bietet eine performante Alternative zu DELETE oder dem Neuerstellen der Tabelle mit WITH REPLACE. Der Befehl ist sowohl für persistente als auch für temporäre Tabellen anwendbar und wurde eingeführt, um effizientes Leeren zu ermöglichen und die Kompatibilität mit anderen Db2-Plattformen zu gewährleisten. IT Jungle: DB2 for i 7.2 Features.Ein Beispiel für die Anwendung:

TRUNCATE TABLE SESSION.MY_TEMP;

Dieser Befehl löscht alle Zeilen der temporären Tabelle MY_TEMP in der aktuellen Session, ohne die Tabellenstruktur zu verändern. Besonders nützlich ist die Option NOT LOGGED, die den Logging-Overhead minimiert und die Performance weiter steigert.

Indizes auf temporären Tabellen

Entgegen der häufigen Annahme, dass temporäre Tabellen keine Indizes unterstützen, können in Db2 for i Indizes auf temporären Tabellen erstellt werden – jedoch nur innerhalb der aktuellen Session und ab IBM i 7.4 (DB2 for i V11.1). Laut IBM-Dokumentation: „If a declared temporary table is referenced in a CREATE INDEX or CREATE VIEW statement, the index or view must be created in SESSION (or library QTEMP).“ IBM Docs: DECLARE GLOBAL TEMPORARY TABLE. Solche Indizes werden im Schema SESSION (QTEMP) angelegt und sind nur für die Dauer der Session verfügbar. Ein praktisches Beispiel:

CREATE INDEX SESSION.IDX_TEMP ON SESSION.TEMP_EMP (Col1, Col2);

Dieser Index beschleunigt Abfragen auf der temporären Tabelle TEMP_EMP, existiert aber nur in der aktuellen Session und wird nach Session-Ende automatisch gelöscht, genau wie die Tabelle selbst. Tests mit IBM i Access Client Solutions (ACS) bestätigen, dass solche Indizes erfolgreich erstellt werden können. Dennoch fehlen temporären Tabellen standardmäßig Indizes und Statistiken, was den SQL-Optimizer einschränken kann, wie Kent Milligan betont: „QTEMP tables limit the query optimizer due to rare indexing.“ MCPress. Entwickler müssen Indizes bei Bedarf manuell in QTEMP erstellen, um die Performance komplexer Abfragen zu verbessern.

Wann solltest Du temporäre Tabellen einsetzen?

  • Zwischenergebnisse: Ideal für mehrstufige Abfragen mit Aggregationen oder Filtern.
  • Daten-Staging: Temporäre Pufferzone vor komplexer Weiterverarbeitung.
  • Performance-Tuning: Kein Journaling, kein Locking – perfekt für Batch-Prozesse.
  • Ad-hoc-Auswertungen: Analyse in Tools wie IBM i Navigator ohne Seiteneffekte.

Beispiel aus der Praxis: Monatsbericht für Verkaufsdaten

Szenario: Ein Unternehmen auf IBM i muss monatlich einen Bericht über die Gesamtumsätze pro Abteilung erstellen. Die Verkaufsdaten befinden sich in einer permanenten Tabelle MYLIB.SALES, die Millionen von Datensätze enthält. Um die Haupttabelle nicht unnötig zu belasten und die Performance zu optimieren, wird eine temporäre Tabelle verwendet, um Zwischenergebnisse zu speichern.
Vorgehensweise:

  1. Erstellung der temporären Tabelle: Eine temporäre Tabelle wird erstellt, um die aggregierten Umsatzdaten pro Abteilung zu speichern. Die Option NOT LOGGED sorgt für eine höhere Performance, da kein Journaling-Overhead entsteht.
  2. Datenaggregation: Die Verkaufsdaten für den aktuellen Monat werden aus der Haupttabelle aggregiert und in die temporäre Tabelle eingefügt.
  3. Abfrage des Berichts: Der Bericht wird durch eine einfache Abfrage der temporären Tabelle erstellt – schnell und effizient.
  4. Automatische Bereinigung: Nach Beendigung der Session wird die temporäre Tabelle automatisch gelöscht, ohne dass manuelle Schritte nötig sind.

SQL-Code für das Beispiel:

-- Schritt 1: Temporäre Tabelle erstellen
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_SALES_REPORT (
    DEPTNO CHAR(3),
    TOTAL_SALES DECIMAL(15,2)
) ON COMMIT PRESERVE ROWS NOT LOGGED;

-- Schritt 2: Daten aggregieren und in die temporäre Tabelle einfügen
INSERT INTO SESSION.TEMP_SALES_REPORT
SELECT DEPTNO, SUM(AMOUNT) AS TOTAL_SALES
FROM MYLIB.SALES
WHERE ORDER_DATE BETWEEN '2025-05-01' AND '2025-05-31'
GROUP BY DEPTNO;

-- Schritt 3: Bericht abfragen
SELECT * FROM SESSION.TEMP_SALES_REPORT
ORDER BY TOTAL_SALES DESC;

-- Hinweis: Die temporäre Tabelle wird am Ende der Session automatisch gelöscht.

Vorteile in diesem Szenario:

  • Schnelle Verarbeitung: Erstellung und Löschung laufen in Millisekunden, was die Erstellung des Berichts beschleunigt.
  • Optimierte I/O: NOT LOGGED minimiert Overhead bei Inserts, wodurch die Aggregation der Verkaufsdaten effizienter wird.
  • Session-Isolation: Kein Konflikt mit anderen Jobs dank QTEMP, ideal für parallele Berichtserstellungen.
  • RPG-freundlich: Gut kombinierbar mit CL und SQLRPGLE, was die Integration in bestehende IBM i-Programme erleichtert.
  • Flexibilität: Die temporäre Tabelle kann für weitere Analysen oder Abfragen genutzt werden, ohne die Haupttabelle zu beeinträchtigen.
  • Automatische Bereinigung: Kein manueller Aufwand für das Löschen der Tabelle nach der Verwendung.

Nachteile in diesem Szenario:

  • Index-Nutzung eingeschränkt: Vor IBM i 7.4 keine Indizes möglich, was die Performance bei komplexen WHERE-Bedingungen einschränken kann. Ab IBM i 7.4 können Indizes erstellt werden, was die Abfrageleistung verbessert.
  • Flüchtig: Daten sind nach Session-Ende weg, was bei längeren Analysen oder Debugging beachtet werden muss.
  • SQL-Plan Cache: QTEMP-Objekte können den Cache belasten, besonders bei häufiger Erstellung ähnlicher Berichte.

Ergebnis: Dieses Beispiel zeigt, wie temporäre Tabellen in einem realen Geschäftsszenario eingesetzt werden können, um die Effizienz zu steigern und die Systemressourcen optimal zu nutzen. Es ist besonders nützlich für IBM i-Entwickler:innen, die komplexe Berichte erstellen müssen, ohne die Produktivdatenbank zu überlasten.

„QTEMP tables limit the query optimizer due to rare indexing.“ – Kent Milligan, MCPress

Technische Feinheiten: table-name & FOR SYSTEM NAME

table-name

Der Tabellenname muss explizit oder implizit mit SESSION qualifiziert werden. Wird kein Qualifier angegeben, wird automatisch SESSION angenommen. Achtung bei Namenskonflikten – temporäre Tabellen überschreiben keine permanenten automatisch.

FOR SYSTEM NAME

Mit dieser Option definierst Du einen internen Systemnamen (max. 10 Zeichen), der bei der Objekterstellung im Hintergrund verwendet wird. Praktisch bei QSHELL- oder API-Zugriffen.

DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_EMP (
    EMPNO CHAR(6),
    SALARY DEC(10,2)
) FOR SYSTEM NAME MYTEMP01 WITH REPLACE NOT LOGGED;

Plattform-spezifische Unterstützung von temporären Tabellen

Es ist wichtig zu beachten, dass die Unterstützung von temporären Tabellen je nach DB2-Plattform variiert. Während DB2 auf IBM i nur DECLARE GLOBAL TEMPORARY TABLE unterstützt, bieten andere DB2-Versionen wie DB2 for z/OS und DB2 for Linux, UNIX, and Windows auch CREATE GLOBAL TEMPORARY TABLE an. Diese Funktion ermöglicht es, temporäre Tabellen zu erstellen, deren Definition im Systemkatalog gespeichert wird und die von mehreren Sitzungen genutzt werden können. Für IBM i bleibt jedoch DECLARE GLOBAL TEMPORARY TABLE die Standardmethode, da sie optimal auf die Plattform abgestimmt ist.

Use Case entscheidet – Performance testen!

Ob temporäre Tabelle, CTE oder View – die richtige Wahl hängt immer vom Use Case ab. Es gibt keine Universallösung.

  • Session-spezifisch? Dann spricht viel für temporäre Tabellen.
  • Komplexe Logik? CTEs sind oft lesbarer und performanter.
  • Viele Abfragen? Indexierbare Objekte wie Views oder persistente Tabellen können überlegen sein.

Nutze Tools wie STRDBMON oder den IBM i Navigator zur Performanceanalyse. Und: Immer vergleichen und loggen!

„Always validate SQL performance in your specific environment.“ – Dan Cruikshank, DB2 Portal

Performance-Vergleich auf einen Blick

Aspekt Temporäre Tabellen Standardtabellen CTEs
Erstellung / Drop ~1 ms, auto-cleanup ~10–100 ms <1 ms (virtuell)
Manipulation (10k Zeilen) ~100 ms ~200–500 ms ~100 ms (reine Abfrage)
Index-Nutzung ✅ (ab IBM i 7.4)

Quelle: IBM Support – Performance considerations for using Declared Global Temporary Tables

Best Practices für IBM i Developer

  • Setze NOT LOGGING, wo keine Rücksicherung nötig ist.
  • Vermeide unnötige Recreates – nutze TRUNCATE TABLE, um temporäre Tabellen zu leeren, wenn die Struktur beibehalten werden soll, oder WITH REPLACE, wenn die Struktur geändert wird.
  • Nutze FOR SYSTEM NAME, um Namenskollisionen zu vermeiden.
  • Teste Performance regelmäßig – besonders bei steigenden Datenmengen.
  • Ab IBM i 7.4: Erstelle Indizes auf temporären Tabellen, um die Abfrageleistung bei komplexen Operationen zu verbessern.

Stimmen aus der Community

„Temporary tables are powerful but require careful testing.“ – Dan Cruikshank, DB2 Portal

“Temporary tables are powerful but require careful testing.” – Dan Cruikshank, DB2 Portal

“Effective DB2 performance tuning begins with a thorough analysis of the application’s requirements and workload characteristics.” – Craig Mullins, Top 10 Performance Tuning Tips – Planet Mainframe

Fazit

Temporäre Tabellen sind ein vielseitiges Werkzeug in DB2 auf IBM i – perfekt für alle, die SQL effizient und sauber einsetzen wollen. Wichtig ist jedoch, dass DB2 auf IBM i nur DECLARE GLOBAL TEMPORARY TABLE unterstützt, während andere Plattformen wie DB2 for z/OS oder DB2 for Linux, UNIX, and Windows auch CREATE GLOBAL TEMPORARY TABLE anbieten. Die Unterstützung für Indizes ab IBM i 7.4 erweitert die Einsatzmöglichkeiten erheblich. Die Wahl des richtigen Tabellentyps hängt immer vom spezifischen Use Case ab. Nicht blind übernehmen, sondern gezielt einsetzen und durchmessen! Für eigene Tests helfen die Beispielabfragen oben als solide Ausgangsbasis.

Quellen


🔎
Transparenzhinweis:
Die Inhalte dieser Website werden mit größtmöglicher Sorgfalt recherchiert und aufbereitet. Quellen werden transparent benannt und regelmäßig geprüft. Dennoch kann keine Garantie für die Richtigkeit, Vollständigkeit oder Aktualität sämtlicher Informationen übernommen werden. Auch bei der Verwendung von künstlicher Intelligenz (z. B. zur Bild- oder Texterstellung) achten wir auf eine sachliche und nachvollziehbare Darstellung – Irrtümer sind jedoch nicht ausgeschlossen.

Bitte beachte: Die Inhalte dienen ausschließlich der allgemeinen Information und stellen keine verbindliche Beratung dar.

Werbung & Affiliate-Links: Manche Beiträge enthalten Affiliate-Links oder werbliche Hinweise. Diese sind entsprechend als Werbung oder Anzeige gekennzeichnet. Wenn du über solche Links einkaufst, erhalten wir ggf. eine kleine Provision – für dich bleibt der Preis gleich.

Markenrechtlicher Hinweis: Alle genannten Markennamen, Logos und Warenzeichen sind Eigentum der jeweiligen Rechteinhaber und dienen hier ausschließlich der identifizierenden Beschreibung. Es besteht keine Verbindung zu den genannten Unternehmen.

Externe Links: Diese Website enthält Verlinkungen zu externen Websites Dritter. Für die Inhalte dieser externen Seiten übernehmen wir trotz sorgfältiger Prüfung keine Verantwortung. Zum Zeitpunkt der Verlinkung waren keine rechtswidrigen Inhalte erkennbar. Eine permanente inhaltliche Kontrolle externer Seiten ist jedoch nicht zumutbar. Bei Bekanntwerden von Rechtsverstößen werden entsprechende Links umgehend entfernt.