Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 11952|Răspunde: 0

[Sursă] Explicație detaliată a tabelelor temporare în bazele de date SQL Server

[Copiază linkul]
Postat pe 28.05.2020 10:52:28 | | | |
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不会被释放掉.




Precedent:Accessor de proprietăți TypeScript (set,get)
Următor:Interogarea SQL Server în zilele anterioare ale orei curente de sistem
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com