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

tiny-tool.de
Was sind temporäre Tabellen?
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.
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
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
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:
- 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. - Datenaggregation: Die Verkaufsdaten für den aktuellen Monat werden aus der Haupttabelle aggregiert und in die temporäre Tabelle eingefügt.
- Abfrage des Berichts: Der Bericht wird durch eine einfache Abfrage der temporären Tabelle erstellt – schnell und effizient.
- 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
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, oderWITH 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
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
- IBM Docs: DECLARE GLOBAL TEMPORARY TABLE
- IBM: Language Reference
- DB2 Portal: Temporary Tables in DB2
- Planet Mainframe
- MCPress: Top 3 Reasons to Avoid Mixing SQL with QTEMP
- IBM Support: Performance Considerations for Declared Global Temporary Tables
- Medium: DB2 SQL Global Temporary Table
- Craig Mullins: Temporary Tables – Declared and Created
- IBM Docs: TRUNCATE
- Stack Overflow: SQL Query to Truncate Table in IBM DB2
- IT Jungle: DB2 for i 7.2 Features and Fun, Part 1
- IBM Docs: DECLARE GLOBAL TEMPORARY TABLE (RDFI 9.6.0)
- IDUG: Temporary Tables in Db2 (along with a painful lesson)
- SEGUS Inc: Global Temporary Confusion
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.