Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Qual è la differenza tra una tabella temporanea e una variabile di tabella in SQL Server?

Esistono alcune differenze tra le tabelle temporanee (#tmp) e le variabili di tabella (@tmp), sebbene l'utilizzo di tempdb non sia una di queste, come spiegato nel collegamento MSDN di seguito.

Come regola generale, per volumi di dati da piccoli a medi e scenari di utilizzo semplici è necessario utilizzare variabili di tabella. (Questa è una linea guida eccessivamente ampia con ovviamente molte eccezioni - vedi sotto e gli articoli seguenti.)

Alcuni punti da considerare quando si sceglie tra di loro:

  • Le tabelle temporanee sono tabelle reali, quindi puoi fare cose come CREARE INDICI, ecc. Se hai grandi quantità di dati per i quali l'accesso tramite indice sarà più veloce, le tabelle temporanee sono una buona opzione.

  • Le variabili di tabella possono avere indici utilizzando i vincoli PRIMARY KEY o UNIQUE. (Se si desidera un indice non univoco, è sufficiente includere la colonna della chiave primaria come ultima colonna nel vincolo univoco. Se non si dispone di una colonna univoca, è possibile utilizzare una colonna di identità.) SQL 2014 ha anche indici non univoci .

  • Le variabili di tabella non partecipano alle transazioni e SELECT s sono implicitamente con NOLOCK . Il comportamento della transazione può essere molto utile, ad esempio se si desidera eseguire il ROLLBACK a metà di una procedura, le variabili di tabella popolate durante tale transazione verranno comunque popolate!

  • Le tabelle temporanee potrebbero comportare la ricompilazione delle stored procedure, forse spesso. Le variabili di tabella non lo faranno.

  • È possibile creare una tabella temporanea utilizzando SELECT INTO, che può essere più veloce da scrivere (utile per query ad hoc) e può consentire di gestire la modifica dei tipi di dati nel tempo, poiché non è necessario definire in anticipo la struttura della tabella temporanea.

  • Puoi passare le variabili di tabella dalle funzioni, consentendoti di incapsulare e riutilizzare la logica molto più facilmente (ad esempio creare una funzione per dividere una stringa in una tabella di valori su un delimitatore arbitrario).

  • L'utilizzo di variabili di tabella all'interno delle funzioni definite dall'utente consente di utilizzare tali funzioni in modo più ampio (consultare la documentazione CREATE FUNCTION per i dettagli). Se stai scrivendo una funzione, dovresti utilizzare le variabili di tabella rispetto alle tabelle temporanee, a meno che non sia necessario diversamente.

  • Sia le variabili di tabella che le tabelle temporanee sono archiviate in tempdb. Ma le variabili di tabella (dal 2005) per impostazione predefinita sono le regole di confronto del database corrente rispetto alle tabelle temporanee che accettano le regole di confronto predefinite di tempdb (ref). Ciò significa che dovresti essere a conoscenza dei problemi di confronto se usi le tabelle temporanee e le tue regole di confronto db sono diverse da quelle di tempdb, causando problemi se desideri confrontare i dati nella tabella temporanea con i dati nel tuo database.

  • Le tabelle temporanee globali (##tmp) sono un altro tipo di tabella temporanea disponibile per tutte le sessioni e gli utenti.

Qualche ulteriore lettura:

  • L'ottima risposta di Martin Smith su dba.stackexchange.com

  • Domande frequenti su MSDN sulla differenza tra i due:https://support.microsoft.com/en-gb/kb/305977

  • Articolo del blog MDSN:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table

  • Articolo:https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables

  • Comportamenti imprevisti e implicazioni sulle prestazioni di tabelle temporanee e variabili temporanee:Paul White su SQLblog.com