|
|
Pubblicato su 28/05/2020 10:52:28
|
|
|
|

Le tabelle temporanee sono molto importanti nel database Sqlserver, e di seguito è riportata un'introduzione dettagliata alle caratteristiche e all'uso delle tabelle temporanee nel database SQL, solo per riferimento.
Le tabelle temporanee sono simili alle tabelle persistenti, ma le tabelle temporanee sono memorizzate in tempdb e vengono automaticamente eliminate quando non sono più in uso. Esistono due tipi di tabelle temporanee: locali e globali. Si distinguono per nome, visibilità e disponibilità.
La tabella temporanea presenta le seguenti caratteristiche:
- Le tabelle temporanee locali sono tabelle che gli utenti aggiungono il prefisso "#" durante la creazione delle tabelle, che sono indipendenti in base alle connessioni al database. Solo la connessione al database che ha creato la tabella temporanea locale ha accesso alla tabella, e le altre connessioni non possono accedervi.
- In connessioni di database diverse, sebbene le tabelle temporanee locali create abbiano lo stesso "nome", queste tabelle non hanno alcuna relazione tra loro. In SQLSERVER, un meccanismo speciale di denominazione garantisce l'indipendenza delle tabelle temporanee locali nelle connessioni al database.
- Le vere tabelle temporanee sfruttano lo spazio temporaneo del database, che viene automaticamente mantenuto dal sistema di database, risparmiando così spazio nella tabella. E poiché lo spazio temporaneo utilizza generalmente la memoria virtuale, il numero di I/O sul disco rigido è notevolmente ridotto, migliorando così anche l'efficienza del sistema.
- La tabella temporanea viene svuotata automaticamente dopo la fine della transazione o della sessione, così non devi ricordarti di cancellare i dati dopo che si esauriscono.
Tabelle temporanee locali
Il nome della tabella temporanea locale è preceduto da un unico simbolo numerico (#); Sono visibili solo alla connessione utente corrente (cioè la connessione che crea la tabella temporanea locale); Viene eliminato quando un utente si disconnette da un'istanza di SQL Server.
Ad esempio, creiamo una tabella temporanea locale in una connessione a un database con la seguente affermazione: #Temp
Connessione al database 1:
Poi avvia contemporaneamente la connessione al database 2 per eseguire la query #temp
Connessione al database 2:
Vediamo qual è il risultato di Database Connection 2?
Connessione al database 2:
I risultati mostrano che la connessione database 2 non riesce a trovare la tabella #Temp. Ciò significa che la #Temp temporanea della tabella è visibile solo alla connessione database 1 che l'ha creata, ma non alla connessione database 2.
Tabella temporanea globale
Il nome di una tabella temporanea globale è preceduto da due simboli numerici (##) ed è visibile a qualsiasi connessione al database quando viene creata, e viene rimosso quando tutte le connessioni al database che fanno riferimento alla tabella vengono disconnesse da SQL Server.
Ad esempio, creiamo una tabella temporanea globale ##Temp in una connessione a un database con la seguente istruzione, e poi inseriamo tre righe di dati
Connessione al database 1:
Poi interroghiamo ##Temp的数据 nella connessione database 2
Connessione al database 2:
Il risultato della connessione 2 al database è il seguente
Connessione al database 2:
Come puoi vedere, la connessione database 2 può accedere con successo alla tabella temporanea globale ##Temp creata dalla connessione database 1, ma se chiudiamo ora la connessione dati 1 e poi eseguiamo il ##Temp查询语句会发生什么呢 della connessione database 2? I risultati sono i seguenti:
Chiudi la connessione database 1, e poi la connessione database 2 viene eseguita di nuovo:
Abbiamo scoperto che, dopo aver chiuso la connessione database 1, la connessione database 2 non riesce a trovare la tabella temporanea globale ##Temp了. Questo perché dopo la chiusura della connessione 1 al database, non c'è alcuna istruzione nella connessione 2 che utilizzi la tabella temporanea ##Temp, quindi SQL Server pensa che al momento non ci sia alcuna connessione al database che faccia riferimento alla tabella temporanea globale ##Temp了, quindi ##Temp释放掉了.
Successivamente, proviamo a chiudere la tabella temporanea globale ##Temp持有事务中的排他锁 (X-lock) nella connessione database 2 e poi a chiudere la connessione database 1.
Connessione al database 1:
Connessione al database 2:
Chiudi la connessione 1 al database, e poi la connessione 2 esegui:
Il risultato mostra che, sebbene chiudiamo la connessione database 1, poiché la connessione database 2 contiene la tabella temporanea globale ##Temp的排他锁 (blocco X) nella transazione, la tabella temporanea # #Temp并没有随着数据库连接1的关闭而被释放掉, finché la transazione iniziata nella connessione database 2 non viene annullata o commettata, la connessione database 2 conterrà sempre la tabella temporanea ##Temp的排他锁. A questo punto, Sqlserver penserà che ci sia ancora una connessione al database che fa riferimento alla tabella temporanea globale ##Temp, quindi ##Temp不会被释放掉. |
Precedente:Accessor proprietà TypeScript (set,get)Prossimo:SQL Server interroga i giorni precedenti dell'ora di sistema corrente
|