Le tabelle temporanee (Temporary Tables) e le variabili di tabella (Table Variables) sono meccanismi diversi per conservare dati intermedi durante l'esecuzione di una query o di una procedura.
Tabelle temporanee (ad esempio, #TempTable in MS SQL):
Variabili di tabella (ad esempio, @MyTable):
Esempio:
-- Tabella temporanea CREATE TABLE #Temp( Id INT, Name NVARCHAR(100) ); INSERT INTO #Temp VALUES (1, 'Test'); SELECT * FROM #Temp; -- Variabile di tabella DECLARE @MyTable TABLE (Id INT, Name NVARCHAR(100)); INSERT INTO @MyTable VALUES (2, 'Sample'); SELECT * FROM @MyTable;
Qual è la differenza tra la durata e l'ambito di visibilità di una tabella temporanea #TempTable e di una tabella temporanea globale ##GlobalTempTable?
Risposta corretta:
#TempTable è visibile solo nella sessione corrente, viene distrutta alla chiusura della connessione o con un DROP esplicito.##GlobalTempTable è accessibile da tutte le sessioni fino alla chiusura dell'ultima sessione che ha utilizzato la tabella o con un DROP esplicito. Essa scompare solo dopo la chiusura dell'ultima connessione che la utilizza.-- Tabella temporanea globale CREATE TABLE ##GlobalTemp (Id INT);
Storia
In un progetto di elaborazione di grandi report, è stata utilizzata una variabile di tabella per la conservazione temporanea di centinaia di migliaia di righe. Risultato: un drastico calo delle prestazioni, poiché l'ottimizzatore ha sovrastimato il costo delle query e ha iniziato a utilizzare piani poco adatti. La sostituzione con una tabella temporanea in tempdb ha portato a un significativo guadagno di tempo.
Storia
In una procedura è stata dimenticata l'eliminazione esplicita della tabella temporanea. Durante le ripetute esecuzioni di batch nella stessa sessione, si sono verificate errori: "l'oggetto esiste già". Il problema è scomparso dopo l'aggiunta di DROP TABLE prima della creazione.
Storia
È stata utilizzata una tabella temporanea globale per la comunicazione tra processi dei report. Non è stato considerato che l'esecuzione simultanea rendeva il comportamento imprevedibile, poiché le sessioni conflittavano per gli stessi dati. È stata presa la decisione di sostituire la tabella globale con tabelle temporanee individuali per ciascuna sessione.