Qual è la differenza tra le tabelle temporanee locali e globali in SQL Server?
Qual è la differenza tra le tabelle temporanee locali e globali in SQL Server?
Risposte:
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.
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.
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.
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:
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.
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.
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