Tabelele temporare sunt foarte importante în baza de date SQLSERVER, iar următoarea este o introducere detaliată a caracteristicilor și utilizării tabelelor temporare în baza de date SQL, doar pentru referință.
Tabelele temporare sunt similare cu tabelele persistente, dar tabelele temporare sunt stocate în tempdb și sunt eliminate automat când nu mai sunt folosite. Există două tipuri de tabele temporare: locale și globale. Se deosebesc prin nume, vizibilitate și disponibilitate.
Tabelul temporar are următoarele caracteristici:
- Tabelele temporare locale sunt tabele pe care utilizatorii le adaugă prefixul "#" atunci când creează tabele, care sunt independente în funcție de conexiunile la baze de date. Doar conexiunea de bază de date care a creat tabelul temporar local are acces la tabel, iar celelalte conexiuni nu pot accesa tabelul.
- În conexiuni diferite de baze de date, deși tabelele temporare locale create au același "nume", aceste tabele nu au nicio legătură între ele. În SQLSERVER, un mecanism special de denumire asigură independența tabelelor temporare locale în conexiunile bazelor de date.
- Tabelele temporare adevărate profită de spațiul temporar al bazei de date, care este menținut automat de sistemul de baze de date, economisind astfel spațiu în tabele. Și pentru că spațiul temporar folosește în general memorie virtuală, numărul de I/O-uri pe hard disk este redus considerabil, astfel că eficiența sistemului este de asemenea îmbunătățită.
- Tabelul temporar este golit automat după ce tranzacția sau sesiunea s-a încheiat, așa că nu trebuie să-ți amintești să ștergi datele după ce se termină.
Tabele temporare locale
Numele tabelului temporar local este precedat de un singur simbol numeric (#); Acestea sunt vizibile doar pentru conexiunea curentă a utilizatorului (adică conexiunea care creează tabelul temporar local); Este ștearsă atunci când un utilizator se deconectează de la o instanță SQL Server.
De exemplu, creăm un tabel temporar local într-o conexiune de bază de date cu următoarea afirmație: #Temp
Conexiunea bazei de date 1:
Apoi pornește conexiunea de bază de date 2 în același timp pentru a efectua interogarea #temp
Conexiunea bazei de date 2:
Să vedem care este rezultatul conexiunii de bază de date 2?
Conexiunea bazei de date 2:
Rezultatele arată că conexiunea de bază de date 2 nu poate găsi tabelul #Temp. Aceasta înseamnă că #Temp temporară a tabelului este vizibil doar pentru conexiunea de bază de date 1 care a creat-o, dar nu și pentru conexiunea de bază de date 2.
Tabel temporar global
Numele unui tabel temporar global este precedat de două simboluri numerice (##) și este vizibil pentru orice conexiuni de bază de date la crearea acesteia, fiind eliminat atunci când toate conexiunile de bază de date care fac referire la tabel sunt deconectate de la SQL Server.
De exemplu, creăm un tabel temporar global ##Temp într-o conexiune de bază de date cu următoarea instrucțiune, apoi inserăm trei rânduri de date
Conexiunea bazei de date 1:
Apoi interogăm ##Temp的数据 în conexiunea de bază de date 2
Conexiunea bazei de date 2:
Rezultatul conexiunii de bază de date 2 este următorul
Conexiunea bazei de date 2:
După cum vezi, conexiunea de bază de date 2 poate accesa cu succes tabelul temporar global ##Temp creat de conexiunea de bază de date 1, dar dacă închidem conexiunea de date 1 din când în când și apoi executăm ##Temp查询语句会发生什么呢 conexiunii de bază de date 2? Rezultatele sunt următoarele:
Închide conexiunea 1 cu baza de date, iar apoi conexiunea 2 se execută din nou:
Am constatat că, după închiderea conexiunii 1 de baze de date, conexiunea 2 nu poate găsi tabelul temporar global ##Temp了. Acest lucru se datorează faptului că, după ce conexiunea 1 de bază de date este închisă, nu există nicio instrucțiune în conexiunea de bază de date 2 care să folosească tabelul temporar ##Temp, astfel că sqlserver crede că nu există nicio conexiune de bază de date care să facă referire la tabelul temporar global ##Temp了 în acest moment, deci va face ##Temp释放掉了.
Apoi, încercăm să închidem tabelul temporar global ##Temp持有事务中的排他锁 (X-lock) în conexiunea 2 cu baza de date și apoi închidem conexiunea 1 cu baza de date.
Conexiunea bazei de date 1:
Conexiunea bazei de date 2:
Închide conexiunea 1 cu baza de date, iar apoi se execută conexiunea 2 cu baza de date:
Rezultatul arată că, deși închidem conexiunea de bază de date 1, deoarece conexiunea de bază de date 2 a ținut tabelul temporar global ##Temp的排他锁 (blocaj X) în tranzacție, tabelul temporar # #Temp并没有随着数据库连接1的关闭而被释放掉, atâta timp cât tranzacția începută în conexiunea de bază de date 2 nu este anulată sau confirmată, atunci conexiunea de bază de date 2 va ține întotdeauna tabelul temporar ##Temp的排他锁. În acest moment, Sqlserver va crede că există încă o conexiune la baza de date care face referire la tabelul temporar global ##Temp, deci ##Temp不会被释放掉. |