Über den Einsatz von temporären Tabellen und Tabellenvariablen in SQL

Es ist wichtig zu verstehen, wann man temporäre Tabellen oder Tabellenvariablen in SQL für die vorübergehende Datenspeicherung verwenden sollte. Beide bieten ähnliche Funktionen, weisen jedoch unterschiedliche Eigenschaften und Anwendungsszenarien auf. In diesem Artikel werden die Merkmale von temporären Tabellen und Tabellenvariablen im Detail erklärt und eine optimale Wahlmethode untersucht.

Inhaltsverzeichnis

Eigenschaften temporärer Tabellen

Temporäre Tabellen sind Tabellen, die zur vorübergehenden Speicherung von Daten in SQL verwendet werden und in der Regel das Präfix # oder ## verwenden.

Erstellungsmethode

Eine temporäre Tabelle wird mit dem Befehl CREATE TABLE erstellt. Zum Beispiel:

CREATE TABLE #TempTable (
    ID INT,
    Name NVARCHAR(50)
);

Verwendung

Temporäre Tabellen eignen sich besonders zur vorübergehenden Speicherung großer Datenmengen, die in mehreren Anweisungen wiederverwendet werden.

Leistung

Da Daten in temporären Tabellen auf der Festplatte gespeichert werden, bieten sie eine stabile Leistung auch bei der Verarbeitung großer Datenmengen, sind jedoch anfälliger für Festplatten-I/O.

Geltungsbereich

Der Geltungsbereich temporärer Tabellen ist auf die Sitzung oder das Batch beschränkt. Sie werden automatisch gelöscht, wenn die Sitzung beendet wird.

-- Beispiel für die Verwendung in einer Sitzung
INSERT INTO #TempTable (ID, Name) VALUES (1, 'Alice');
SELECT * FROM #TempTable;

Eigenschaften von Tabellenvariablen

Tabellenvariablen sind Tabellen, die in SQL als Variablen behandelt werden können und hauptsächlich für temporäre Datenoperationen verwendet werden.

Deklarationsmethode

Eine Tabellenvariable wird mit dem Befehl DECLARE deklariert. Zum Beispiel:

DECLARE @TableVar TABLE (
    ID INT,
    Name NVARCHAR(50)
);

Verwendung

Tabellenvariablen eignen sich gut für die Verarbeitung kleiner Datenmengen oder für die vorübergehende Speicherung von Daten innerhalb von gespeicherten Prozeduren.

Leistung

Da Tabellenvariablen im Speicher gespeichert werden, bieten sie bei der Verarbeitung kleiner Datenmengen eine hohe Geschwindigkeit. Sie sind jedoch für große Datenmengen ungeeignet.

Geltungsbereich

Der Geltungsbereich von Tabellenvariablen ist auf das deklarierte Batch oder die gespeicherte Prozedur beschränkt. Sie werden automatisch freigegeben, wenn der Geltungsbereich verlassen wird.

-- Beispiel für die Verwendung in einem Batch
INSERT INTO @TableVar (ID, Name) VALUES (1, 'Alice');
SELECT * FROM @TableVar;

Leistungsvergleich

Die Leistung temporärer Tabellen und Tabellenvariablen variiert je nach Datenmenge und Operation. Hier wird der Leistungsunterschied anhand konkreter Beispiele verglichen.

Bei kleinen Datenmengen

Bei der Verarbeitung kleiner Datenmengen bieten Tabellenvariablen eine bessere Leistung, da die Daten im Speicher verarbeitet werden und keine Festplatten-I/O-Überlastung entsteht.

-- Beispiel für die gute Leistung von Tabellenvariablen
DECLARE @TableVar TABLE (ID INT, Name NVARCHAR(50));
INSERT INTO @TableVar (ID, Name) VALUES (1, 'Alice'), (2, 'Bob');
SELECT * FROM @TableVar;

Bei großen Datenmengen

Bei der Verarbeitung großer Datenmengen eignen sich temporäre Tabellen besser. Da die Daten auf der Festplatte gespeichert werden, unterliegen sie weniger den Einschränkungen des Speichers, und es können Indizes erstellt werden.

-- Beispiel für die Verwendung einer temporären Tabelle bei großen Datenmengen
CREATE TABLE #TempTable (ID INT, Name NVARCHAR(50));
INSERT INTO #TempTable (ID, Name)
SELECT ID, Name FROM LargeSourceTable;
CREATE INDEX idx_temp ON #TempTable(ID);
SELECT * FROM #TempTable;

Vorhandensein von Indizes

In temporären Tabellen können Indizes erstellt werden, um die Leistung zu verbessern. Bei Tabellenvariablen ist die Erstellung von Indizes eingeschränkt, was die Leistung bei großen Abfragen beeinträchtigen kann.

Verarbeitung komplexer Abfragen

Temporäre Tabellen bieten auch bei komplexen Abfragen und Joins eine stabile Leistung. Tabellenvariablen cachen bestimmte Abfragepläne nicht, was zu einer geringeren Leistung bei komplexen Operationen führen kann.

-- Beispiel für die Verwendung einer temporären Tabelle bei komplexen Abfragen
CREATE TABLE #TempTable (ID INT, Name NVARCHAR(50));
INSERT INTO #TempTable (ID, Name)
SELECT ID, Name FROM LargeSourceTable;
SELECT t1.ID, t2.Name
FROM #TempTable t1
JOIN AnotherTable t2 ON t1.ID = t2.ID;

Unterschiede in Geltungsbereich und Lebensdauer

Temporäre Tabellen und Tabellenvariablen haben jeweils unterschiedliche Geltungsbereiche und Lebensdauern. Diese Unterschiede zu verstehen, ist wichtig, um die richtige Verwendung zu wählen.

Geltungsbereich temporärer Tabellen

Der Geltungsbereich temporärer Tabellen ist auf die erstellte Sitzung oder das Batch beschränkt. Wenn die Sitzung beendet oder das Batch abgeschlossen ist, werden sie automatisch gelöscht. Lokale temporäre Tabellen (#TempTable) sind nur in der aktuellen Sitzung gültig, während globale temporäre Tabellen (##TempTable) auch von anderen Sitzungen aus zugänglich sind.

-- Beispiel für den Geltungsbereich temporärer Tabellen
CREATE TABLE #TempTable (ID INT, Name NVARCHAR(50));
-- Die Tabelle #TempTable wird automatisch gelöscht, wenn die Sitzung endet

Geltungsbereich von Tabellenvariablen

Der Geltungsbereich von Tabellenvariablen ist auf das deklarierte Batch oder die gespeicherte Prozedur beschränkt. Sie werden automatisch freigegeben, wenn der Geltungsbereich verlassen wird.

-- Beispiel für den Geltungsbereich von Tabellenvariablen
DECLARE @TableVar TABLE (ID INT, Name NVARCHAR(50));
-- Die Tabellenvariable @TableVar wird freigegeben, sobald das Batch beendet ist

Unterschiede in der Lebensdauer

Temporäre Tabellen hängen von der Lebensdauer der Sitzung ab. Wenn eine Sitzung über einen längeren Zeitraum aktiv bleibt, existiert die temporäre Tabelle für diese Dauer. Im Gegensatz dazu werden Tabellenvariablen sofort nach Abschluss des Batches oder der gespeicherten Prozedur freigegeben.

Anwendungsbeispiele für Geltungsbereich und Lebensdauer

Wenn Daten über mehrere Batches oder gespeicherte Prozeduren in einer Sitzung gemeinsam genutzt werden müssen, sind temporäre Tabellen die bessere Wahl. Wenn die Daten nur innerhalb eines Batches oder einer gespeicherten Prozedur benötigt werden, sind Tabellenvariablen praktischer.

-- Beispiel für die Verwendung temporärer Tabellen
CREATE TABLE #SessionTemp (ID INT, Name NVARCHAR(50));
INSERT INTO #SessionTemp (ID, Name) VALUES (1, 'Alice');

-- Zugriff aus einem anderen Batch oder einer anderen gespeicherten Prozedur
SELECT * FROM #SessionTemp;

-- Beispiel für die Verwendung von Tabellenvariablen
DECLARE @BatchVar TABLE (ID INT, Name NVARCHAR(50));
INSERT INTO @BatchVar (ID, Name) VALUES (1, 'Alice');
SELECT * FROM @BatchVar;
-- @BatchVar wird freigegeben, sobald das Batch endet

Anwendungsszenarien für temporäre Tabellen und Tabellenvariablen

Temporäre Tabellen und Tabellenvariablen sind in bestimmten Szenarien jeweils die beste Wahl. Hier werden konkrete Anwendungsszenarien erläutert.

Szenarien, in denen temporäre Tabellen geeignet sind

Temporäre Tabellen sind besonders in folgenden Szenarien nützlich:

Verarbeitung großer Datenmengen

Temporäre Tabellen eignen sich zur vorübergehenden Speicherung großer Datenmengen, die wiederholt in mehreren Anweisungen verarbeitet werden. Da die Daten auf der Festplatte gespeichert werden, sind sie weniger durch den Speicher begrenzt.

CREATE TABLE #TempTable (ID INT, Name NVARCHAR(50));
INSERT INTO #TempTable (ID, Name) SELECT ID, Name FROM LargeTable;
SELECT * FROM #TempTable WHERE ID > 1000;

Erstellung von Indizes

Temporäre Tabellen eignen sich, wenn Indizes zur Leistungssteigerung von Abfragen erforderlich sind.

CREATE TABLE #TempTable (ID INT, Name NVARCHAR(50));
INSERT INTO #TempTable (ID, Name) SELECT ID, Name FROM LargeTable;
CREATE INDEX idx_temp ON #TempTable(ID);
SELECT * FROM #TempTable WHERE ID > 1000;

Datenfreigabe zwischen Sitzungen

Temporäre Tabellen eignen sich, wenn Daten über die gesamte Sitzung hinweg gemeinsam genutzt werden müssen, z. B. bei der gemeinsamen Nutzung von Daten zwischen gespeicherten Prozeduren oder Batches.

CREATE TABLE #TempTable (ID INT, Name NVARCHAR(50));
INSERT INTO #TempTable (ID, Name) VALUES (1, 'Alice');
-- Zugriff aus einem anderen Batch oder einer gespeicherten Prozedur
SELECT * FROM #TempTable;

Szenarien, in denen Tabellenvariablen geeignet sind

Tabellenvariablen sind besonders in folgenden Szenarien nützlich:

Verarbeitung kleiner Datenmengen

Tabellenvariablen eignen sich zur Verarbeitung kleiner Datenmengen. Da die Operationen im Speicher stattfinden, sind sie sehr schnell.

DECLARE @TableVar TABLE (ID INT, Name NVARCHAR(50));
INSERT INTO @TableVar (ID, Name) VALUES (1, 'Alice'), (2, 'Bob');
SELECT * FROM @TableVar;

Vorübergehende Datenspeicherung

Tabellenvariablen eignen sich, wenn Daten nur vorübergehend innerhalb eines einzelnen Batches oder einer gespeicherten Prozedur gespeichert werden müssen.

DECLARE @TableVar TABLE (ID INT, Name NVARCHAR(50));
INSERT INTO @TableVar (ID, Name) VALUES (1, 'Alice');
-- Die Tabellenvariable @TableVar wird freigegeben, sobald das Batch endet
SELECT * FROM @TableVar;

Verwendung innerhalb eines Triggers

Tabellenvariablen eignen sich auch zur vorübergehenden Speicherung von Daten innerhalb eines Triggers. Da der Geltungsbereich eines Triggers begrenzt ist, ist die Leichtgewichtigkeit von Tabellenvariablen von Vorteil.

CREATE TRIGGER trgAfterInsert ON SampleTable
AFTER INSERT AS
BEGIN
    DECLARE @InsertedData TABLE (ID INT, Name NVARCHAR(50));
    INSERT INTO @InsertedData (ID, Name)
    SELECT ID, Name FROM Inserted;
    -- Datenverarbeitung innerhalb des Triggers
    SELECT * FROM @InsertedData;
END;

Best Practices in SQL

Hier werden Best Practices vorgestellt, um temporäre Tabellen und Tabellenvariablen optimal zu nutzen. Dies verbessert die Leistung und Effizienz von SQL-Abfragen.

Wahl basierend auf der Datenmenge

Die Leistung kann optimiert werden, indem für kleine Datenmengen Tabellenvariablen und für große Datenmengen temporäre Tabellen verwendet werden.

-- Tabellenvariablen für kleine Datenmengen
DECLARE @SmallData TABLE (ID INT, Name NVARCHAR(50));
INSERT INTO @SmallData (ID, Name) VALUES (1, 'Alice'), (2, 'Bob');
SELECT * FROM @SmallData;

-- Temporäre Tabellen für große Datenmengen
CREATE TABLE #LargeData (ID INT, Name NVARCHAR(50));
INSERT INTO #LargeData (ID, Name) SELECT ID, Name FROM LargeSourceTable;
SELECT * FROM #LargeData;

Nutzung von Indizes

Durch das Erstellen von Indizes in temporären Tabellen kann die Leistung von Abfragen bei großen Datenmengen erheblich verbessert werden.

CREATE TABLE #IndexedTable (ID INT, Name NVARCHAR(50));
INSERT INTO #IndexedTable (ID, Name) SELECT ID, Name FROM LargeSourceTable;
CREATE INDEX idx_temp ON #IndexedTable(ID);
SELECT * FROM #IndexedTable WHERE ID > 1000;

Bewusste Gestaltung des Geltungsbereichs

Eine bewusste Gestaltung des Daten-Geltungsbereichs und der Lebensdauer hilft, unnötigen Ressourcenverbrauch zu vermeiden.

-- Verwenden Sie temporäre Tabellen für Daten, die über die gesamte Sitzung benötigt werden
CREATE TABLE #SessionData (ID INT, Name NVARCHAR(50));
INSERT INTO #SessionData (ID, Name) VALUES (1, 'Alice');
-- Zugriff außerhalb des Geltungsbereichs möglich
SELECT * FROM #SessionData;

-- Verwenden Sie Tabellenvariablen für Daten, die nur innerhalb eines Batches benötigt werden
DECLARE @BatchData TABLE (ID INT, Name NVARCHAR(50));
INSERT INTO @BatchData (ID, Name) VALUES (1, 'Alice');
-- Die Tabellenvariable wird freigegeben, wenn das Batch endet
SELECT * FROM @BatchData;

Einfache Wartung

Da Tabellenvariablen nach Abschluss des Batches automatisch freigegeben werden, verhindern sie Speicherlecks und sind einfacher zu warten. Ihre Verwendung in gespeicherten Prozeduren wird besonders empfohlen.

-- Beispiel für die Verwendung von Tabellenvariablen in einer gespeicherten Prozedur
CREATE PROCEDURE SampleProcedure
AS
BEGIN
    DECLARE @ProcData TABLE (ID INT, Name NVARCHAR(50));
    INSERT INTO @ProcData (ID, Name) VALUES (1, 'Alice');
    SELECT * FROM @ProcData;
END;

Testen und Überwachen der Leistung

Es ist wichtig, Szenarien zu testen und die tatsächliche Leistung zu überwachen, um die beste Wahl zu treffen.

-- Führen Sie Tests in realen Szenarien durch
-- Verwenden Sie Überwachungstools, um die Effizienz zu überprüfen

Zusammenfassung

Hier fassen wir die wichtigsten Punkte zur Unterscheidung zwischen temporären Tabellen und Tabellenvariablen zusammen.

Temporäre Tabellen eignen sich für die Verarbeitung großer Datenmengen oder wenn Indizes erstellt werden müssen und sind nützlich, um Daten über die gesamte Sitzung hinweg gemeinsam zu nutzen. Tabellenvariablen eignen sich besser für die Verarbeitung kleiner Datenmengen oder zur vorübergehenden Datenspeicherung innerhalb eines einzigen Batches, da sie eine schnelle Verarbeitung im Speicher ermöglichen. Die Wahl der richtigen Methode je nach Szenario maximiert die Leistung von SQL-Abfragen.

Inhaltsverzeichnis