Questo articolo Γ¨ una parziale traduzione allβoriginale che trovate qui.
Introduzione
Lavorando con SQL Server capiterΓ stesso che, per risolvere numerosi problemi, sarΓ necessario immagazzinare i dati in tabelle temporanee. T-SQL offre due diverse modalitΓ per questo scopo, le varibili di tabella e le tabelle temporanee.
La prima differenza da rilevare tra le due modalitΓ Γ¨ la sintassi: le tabelle temporanee si scrivono con il prefisso # (#tempTable
), mentre le variabili di tabella come tutte le altre variabili, quindi anteponendo @ (@tempTable
).
DECLARE @tmp TABLE (Col1 INT, Col2 INT);
CREATE TABLE #tmp (Col1 INT, Col2 INT);
Le tabelle temporanee sono normali tabelle SQL che sono memorizzate nel tempDB. Lβunica differenza tra queste Γ¨ una normale tabella Γ¨ che queste non permettono di definire una chiave esterna su di esse.
La variabili di tabella invece non vengono memorizzate in nessun DB e vengono eliminate una volta terminata la sessione.
Di seguito approfondiamo tutte le differenze tra le due.
Scope
Le tabelle #tempTable
possono essere viste da qualsiasi oggetto che viene lanciato nella stessa sessione: quindi se definisco una tabella #tempTable
nella procedura A, poi questa chiama la procedura B, la procedura B avrΓ modo di accedere allo stesso modo alla tabella temporanea.
Una volta che la sessione Γ¨ terminata, la #tempTable
associata a questa sessione verrΓ deallocata (ma rimarrΓ comunque nel datamase temporaneo).
Le variabili @tempTable
hanno scope limitato alla procedura che le crea, non possono essere chiamate da unβaltra procedura nella stessa sessione.
SELECT INTO
Con una tabella temporanea #tempTable
Γ¨ possibile catturare i risultati di una SELECT INTO
in una nuova tabella senza che questa sia definita prima e le cui colonne e tipi sono create runtime.
SELECT * INTO #temp FROM foo
Questo non Γ¨ possibile con una variabile di tabella @temp
.
Scrittura su disco
Entrambe le modalitΓ scrivono su disco con la stessa velocitΓ .
Ricompilazione
La ricompilazione Γ¨ il maggiore vantaggio per le variabili @table
. Se il set di dati da cui prendo i valori Γ¨ piccolo e non cambia, conviene sicuramente usare le @table
che evitano rallentamenti di ricompilazione.
Indici particolari
Se voglio scrivere un indice che non puΓ² essere creato implicitamente con i vincoli di UNIQUE
e PRIMARY KEY
, allora devo per forza utilizzare le variabili #table
(esempi di questi indici sono quelli non unique, indici filtrati o indici con colonne INCLUDED
)
Numerose operazioni
Se devo ripetutamente aggiungere e eliminare un grande numero di righe dalla tabella, allora conviene (a livello di prestazioni) usare una tabella #tempTable
.
Ricordiamo che questa supporta lβistruzione TRUNCATE
(a differenza della @table) che Γ¨ piΓΉ efficente del DELETE
.
Transazioni
Le varibiali @tempTable
non partecipano alle transazioni, questo significa che sono veloci ma meno sicure, per esempio se faccio un ROLLBACK
i valori delle variabili @tempTable
non vengono modificati.
Eliminazione
Le #tempTable
devono essere eliminate dopo lβuso (pratica di buona programmazione), le @tempTable
no in quanto vengono eliminate automaticamente.
Esempio di eliminazione di una tabella temporanea #tempTable
:
IF(OBJECT_ID('tempdb..#tempTable') IS NOT NULL) DROP TABLE #tempTable
Conclusione
Per concludere, se sto lavorando con un piccolo insieme di dati (numero di righe minore di 100) e che la sorgente da cui questi dati vengono presi non cambia, conviene usare le variabili @tempTable
, in tutti gli altri casi #tempTable
.