Tabelle temporanee locali e globali in SQL Server


156

Qual è la differenza tra le tabelle temporanee locali e globali in SQL Server?


2
Ecco alcuni dettagli di sintesi su questo, clicca qui
Jayesh Sorathia,

5
Fare attenzione quando si utilizzano le variabili di tabella. Se li usi in una query, possono causare seri problemi di prestazioni con il tuo piano di query poiché non sono indicizzati.

In realtà, le tabelle temporanee possono essere indicizzate, se necessario, ma ciò richiede tempo e risorse, quindi potrebbe comunque causare problemi di prestazioni o risorse.
Andrew Steitz,

Risposte:


114

Trovo questa spiegazione abbastanza chiara (è pura copia di Technet ):

Esistono due tipi di tabelle temporanee: locale e globale. Le tabelle temporanee locali sono visibili solo ai loro creatori durante la stessa connessione a un'istanza di SQL Server di quando le tabelle sono state create o referenziate per la prima volta. Le tabelle temporanee locali vengono eliminate dopo che l'utente si disconnette dall'istanza di SQL Server. Le tabelle temporanee globali sono visibili a qualsiasi utente e qualsiasi connessione dopo la loro creazione e vengono eliminate quando tutti gli utenti che fanno riferimento alla tabella si disconnettono dall'istanza di SQL Server.


Ottima, utile risposta! Stavo cercando le informazioni specifiche su se / quando le tabelle temporanee globali venivano automaticamente ripulite da SQL Server.
kwill

Risposta molto chiara e concisa. Qualcuno può pensare a un buon caso d'uso per le tabelle temporanee globali? Uno che illustra il loro scopo in contrasto con quello delle tabelle temporanee locali?
Trevor

336
  • Le variabili di tabella ( DECLARE @t TABLE) sono visibili solo alla connessione che la crea e vengono eliminate al termine della procedura batch o memorizzata.

  • Le tabelle temporanee locali ( CREATE TABLE #t) sono visibili solo alla connessione che la crea e vengono eliminate quando la connessione viene chiusa.

  • Le tabelle temporanee globali ( CREATE TABLE ##t) sono visibili a tutti e vengono eliminate quando tutte le connessioni a cui si fa riferimento sono state chiuse.

  • Le tabelle permanenti di Tempdb ( USE tempdb CREATE TABLE t) sono visibili a tutti e vengono eliminate al riavvio del server.


55
Vale anche la pena sottolineare: le tabelle temporanee locali vengono eliminate quando viene chiuso l'ambito che le ha create. Quindi, se crei una tabella temporanea locale all'interno di uno sproc e poi provi ad accedervi al di fuori di quello sproc, non esisterà.

+1 per Will. Stavo cercando di utilizzare una tabella temporanea locale come ottimizzatore e stavo cercando di utilizzare una procedura memorizzata come inizializzatore "crea e popola se non esiste". Come dici tu, non funziona se non usi invece una tabella temporanea globale.
Quillbreaker,

9
"vengono eliminati quando tutte le connessioni che li hanno referenziati sono chiuse" - cosa significa esattamente "che li hanno referenziati"? Se uno StoredProc da una connessione n. 1 crea una TempTable ## posso vederlo da un'altra connessione n. 2, dire 10 minuti più tardi (se quella connessione n. 2 era attiva al momento della creazione della tabella?) RISPOSTA: Le tabelle temporanee globali vengono automaticamente eliminate quando il la sessione che ha creato la tabella termina e tutte le altre attività hanno smesso di fare riferimento a esse. (vedi di più in questa pagina con risposta diversa)
tbone

Ho provato a utilizzare una procedura memorizzata per creare tabelle temporanee locali (#t) necessarie per la logica successiva, tuttavia è emerso che la procedura memorizzata padre doveva crearle per renderle disponibili per le chiamate della procedura memorizzata figlio. Questa è stata una cosa triste, perché abbiamo un sacco di procedure memorizzate che devono impostare le tabelle allo stesso modo e richiamare in sprocs comuni. Le tabelle temporanee globali funzioneranno in questo caso in cui le chiamate secondarie avranno accesso alle tabelle create da un fratello? Stiamo usando SQL Server 2008.
Brandon

1
@Brandon Hai perfettamente ragione. Questa è la funzionalità mancante. Il supporto di TSQL per il corretto scoping dei dati transitori è piuttosto impreciso. È come se i progettisti del linguaggio volessero che tutto fosse globale. E non c'è quasi alcun supporto per le chiusure. È possibile passare una variabile cursore. Ma questa è un'altra lattina di worm perché riga per riga agonizzante non c'è modo di andare.
Anthony Faull,

12

1.) Una tabella temporanea locale esiste solo per la durata di una connessione o, se definita all'interno di un'istruzione composta, per la durata dell'istruzione composta.

Le tabelle temporanee locali sono disponibili solo per la sessione o la connessione di SQL Server (significa utente singolo) che ha creato le tabelle. Questi vengono automaticamente eliminati quando la sessione che ha creato le tabelle è stata chiusa. Il nome della tabella temporanea locale è contrassegnato da un singolo segno hash ("#").

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

L'ambito della tabella temporanea locale esiste per la sessione corrente dell'utente corrente significa per la finestra di query corrente. Se chiuderai la finestra della query corrente o aprirai una nuova finestra della query e proverai a trovare la tabella temporanea sopra creata, ti darà l'errore.


2.) Una tabella temporanea globale rimane permanentemente nel database, ma le righe esistono solo all'interno di una determinata connessione. Quando la connessione viene chiusa, i dati nella tabella temporanea globale scompaiono. Tuttavia, la definizione della tabella rimane con il database per l'accesso alla successiva apertura del database.

Le tabelle temporanee globali sono disponibili per tutte le sessioni o connessioni di SQL Server (significa tutto l'utente). Questi possono essere creati da qualsiasi utente della connessione di SQL Server e vengono automaticamente eliminati quando tutte le connessioni di SQL Server sono state chiuse. Il nome della tabella temporanea globale è contrassegnato da un doppio segno di hash ("##").

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

Le tabelle temporanee globali sono visibili a tutte le connessioni di SQL Server mentre le tabelle temporanee locali sono visibili solo alla connessione corrente di SQL Server.


2
La tua definizione di una tabella temporanea globale è come mi aspetto che si comporti (proveniente da altri DB), ma i miei test mostrano che ciò che effettivamente accade in SQL Server è: "Le tabelle temporanee globali vengono automaticamente eliminate quando la sessione che ha creato la tabella termina e tutte le altre attività hanno smesso di
riferirle

11

Citando da libri online:

Le tabelle temporanee locali sono visibili solo nella sessione corrente; le tabelle temporanee globali sono visibili a tutte le sessioni.

Le tabelle temporanee vengono eliminate automaticamente quando escono dall'ambito, a meno che non vengano esplicitamente eliminate utilizzando DROP TABLE:

  • Una tabella temporanea locale creata in una procedura memorizzata viene eliminata automaticamente al completamento della procedura memorizzata. È possibile fare riferimento alla tabella da qualsiasi stored procedure nidificata eseguita dalla stored procedure che ha creato la tabella. Non è possibile fare riferimento alla tabella dal processo che ha chiamato la stored procedure che ha creato la tabella.
  • Tutte le altre tabelle temporanee locali vengono eliminate automaticamente alla fine della sessione corrente.
  • Le tabelle temporanee globali vengono eliminate automaticamente quando termina la sessione che ha creato la tabella e tutte le altre attività hanno smesso di fare riferimento a esse. L'associazione tra un'attività e una tabella viene mantenuta solo per la durata di una singola istruzione Transact-SQL. Ciò significa che una tabella temporanea globale viene eliminata al completamento dell'ultima istruzione Transact-SQL che faceva riferimento attivamente alla tabella al termine della sessione di creazione.

0

Tabelle temporanee locali : se si creano tabelle temporanee locali e quindi si apre un'altra connessione e si tenta la query, verrà visualizzato il seguente errore.

le tabelle temporanee sono accessibili solo all'interno della sessione che le ha create.

Tabelle temporanee globali : a volte, potresti voler creare una tabella temporanea accessibile ad altre connessioni. In questo caso, è possibile utilizzare le tabelle temporanee globali.

Le tabelle temporanee globali vengono distrutte solo quando tutte le sessioni che fanno riferimento ad essa vengono chiuse.


0

Vale la pena ricordare che esistono anche: tabelle temporanee globali con ambito database (attualmente supportato solo dal database SQL di Azure).

Le tabelle temporanee globali per SQL Server (avviate con ## nome tabella) sono archiviate in tempdb e condivise tra tutte le sessioni degli utenti nell'intera istanza di SQL Server.

Il database SQL di Azure supporta tabelle temporanee globali archiviate anche in tempdb e con ambito a livello di database. Ciò significa che le tabelle temporanee globali sono condivise per tutte le sessioni degli utenti all'interno dello stesso database SQL di Azure. Le sessioni utente da altri database non possono accedere alle tabelle temporanee globali.

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

CONFIGURAZIONE SCOPED ALTER DATABASE

GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }

SI APPLICA A: Database SQL di Azure (la funzionalità è in anteprima pubblica)

Consente di impostare la funzionalità di eliminazione automatica per le tabelle temporanee globali. L'impostazione predefinita è ON, il che significa che le tabelle temporanee globali vengono eliminate automaticamente quando non vengono utilizzate da alcuna sessione. Se impostato su OFF, le tabelle temporanee globali devono essere eliminate esplicitamente utilizzando un'istruzione DROP TABLE o verranno automaticamente eliminate al riavvio del server.

Con i singoli database e pool elastici del database SQL di Azure, questa opzione può essere impostata nei singoli database utente del server del database SQL. Nell'istanza gestita di SQL Server e Database SQL di Azure, questa opzione è impostata in TempDB e l'impostazione dei singoli database utente non ha alcun effetto.


0

Non ho visto alcuna risposta mostrare agli utenti dove possiamo trovare una tabella Temp globale. È possibile visualizzare le tabelle temporanee locali e globali nella stessa posizione durante la navigazione in SSMS. Schermata di seguito presa da questo link .

Database -> Database di sistema -> tempdb -> Tabelle temporanee

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.