Tijdelijke tabellen (Temporary Tables) en tabelvariabelen (Table Variables) zijn verschillende mechanismen voor het opslaan van tussentijdse gegevens tijdens de uitvoering van een query of procedure.
Tijdelijke tabellen (bijvoorbeeld #TempTable in MS SQL):
Tabelvariabelen (bijvoorbeeld @MyTable):
Voorbeeld:
-- Tijdelijke tabel CREATE TABLE #Temp( Id INT, Name NVARCHAR(100) ); INSERT INTO #Temp VALUES (1, 'Test'); SELECT * FROM #Temp; -- Tabelvariabele DECLARE @MyTable TABLE (Id INT, Name NVARCHAR(100)); INSERT INTO @MyTable VALUES (2, 'Sample'); SELECT * FROM @MyTable;
Wat is het verschil tussen de levensduur en zichtbaarheid van tijdelijke tabel #TempTable en globale tijdelijke tabel ##GlobalTempTable?
Juiste antwoord:
#TempTable is alleen zichtbaar in de huidige sessie, wordt vernietigd bij het sluiten van de verbinding of expliciete DROP.##GlobalTempTable is beschikbaar voor alle sessies totdat de laatste sessie die de tabel heeft gebruikt, wordt gesloten, of expliciete DROP. Het verdwijnt pas na het sluiten van de laatste verbinding die het gebruikt.-- Globale tijdelijke tabel CREATE TABLE ##GlobalTemp (Id INT);
Verhaal
In een project voor het verwerken van grote rapporten werd een tabelvariabele gebruikt voor tijdelijke opslag van honderden duizenden rijen. Resultaat: een scherpe daling van de prestaties, omdat de optimizer de kosten van de queries overschatte en begon met het gebruiken van slecht passende plannen. Vervanging door een tijdelijke tabel in tempdb resulteerde in een aanzienlijke tijdswinst.
Verhaal
In een procedure vergaten ze de tijdelijke tabel expliciet te verwijderen. Bij herhaalde batchuitvoeringen in dezelfde sessie traden fouten op: "object bestaat al". Het probleem verdween na het toevoegen van DROP TABLE vóór het maken.
Verhaal
Een globale tijdelijke tabel werd gebruikt voor inter-process communicatie van rapporten. Men hield er geen rekening mee dat gelijktijdige uitvoering het gedrag onvoorspelbaar maakte — sessies conflicteerden over dezelfde gegevens. Er werd besloten om de globale tabel te vervangen door individuele tijdelijke tabellen voor elke sessie.