Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 11952|Antwoord: 0

[Bron] Gedetailleerde uitleg van tijdelijke tabellen in SQL-serverdatabases

[Link kopiëren]
Geplaatst op 28-05-2020 10:52:28 | | | |
Tijdelijke tabellen zijn erg belangrijk in de SQL-database, en hieronder volgt een gedetailleerde introductie tot de kenmerken en het gebruik van tijdelijke tabellen in een SQL-database, uitsluitend ter referentie.

Tijdelijke tabellen lijken op persistente tabellen, maar tijdelijke tabellen worden opgeslagen in tempdb en automatisch verwijderd wanneer ze niet meer in gebruik zijn. Er zijn twee typen tijdelijke tabellen: lokaal en globaal. Ze worden onderscheiden door naam, zichtbaarheid en beschikbaarheid.

De tijdelijke tabel heeft de volgende kenmerken:

  • Lokale tijdelijke tabellen zijn tabellen die gebruikers het voorvoegsel "#" toevoegen bij het aanmaken van tabellen, die onafhankelijk zijn afhankelijk van databaseverbindingen. Alleen de databaseverbinding die de lokale tijdelijke tabel heeft aangemaakt, heeft toegang tot de tabel, en andere verbindingen kunnen de tabel niet benaderen.
  • In verschillende databaseverbindingen, hoewel de lokale tijdelijke tabellen dezelfde "naam" hebben, hebben deze tabellen geen relatie met elkaar. In SQLSERVER zorgt een speciaal naamgevingsmechanisme voor de onafhankelijkheid van lokale tijdelijke tabellen in databaseverbindingen.
  • Echte tijdelijke tabellen maken gebruik van tijdelijke tabelruimte in de database, die automatisch door het databasesysteem wordt onderhouden, waardoor tabelruimte wordt bespaard. En omdat de tijdelijke tabelruimte doorgaans virtueel geheugen gebruikt, is het aantal I/O's op de harde schijf sterk verminderd, waardoor de systeemefficiëntie ook verbetert.
  • De tijdelijke tabel wordt automatisch geleegd nadat de transactie of sessie is afgerond, dus je hoeft de data niet te verwijderen nadat deze op is.


Lokale tijdelijke tabellen

De naam van de lokale tijdelijke tabel wordt voorafgegaan door één numeriek symbool (#); Ze zijn alleen zichtbaar voor de huidige gebruikersverbinding (d.w.z. de verbinding die de lokale tijdelijke tabel aanmaakt); Het wordt verwijderd wanneer een gebruiker de verbinding verbreekt met een SQL Server-instantie.

We maken bijvoorbeeld een lokale tijdelijke tabel aan in een databaseverbinding met de volgende instructie: #Temp

Databaseverbinding 1:



Start vervolgens tegelijkertijd de databaseverbinding 2 om de query uit te voeren #temp

Databaseverbinding 2:



Laten we eens kijken wat het resultaat is van databaseverbinding 2?

Databaseverbinding 2:



De resultaten tonen aan dat databaseverbinding 2 tabel #Temp niet kan vinden. Dit betekent dat de tijdelijke tabel #Temp alleen zichtbaar is voor de databaseverbinding 1 die deze heeft aangemaakt, maar niet voor databaseverbinding 2.

Globale tijdelijke tabel

De naam van een globale tijdelijke tabel wordt voorafgegaan door twee numerieke symbolen (##) en is zichtbaar voor alle databaseverbindingen bij het aanmaken, en wordt verwijderd wanneer alle databaseverbindingen die naar de tabel verwijzen worden losgekoppeld van SQL Server.

We maken bijvoorbeeld een globale tijdelijke tabel ##Temp aan in een databaseverbinding met de volgende instructie, en voegen vervolgens drie rijen data in

Databaseverbinding 1:



Vervolgens zoeken we ##Temp的数据 in databaseverbinding 2

Databaseverbinding 2:



Het resultaat van databaseverbinding 2 is als volgt

Databaseverbinding 2:



Zoals je ziet, kan databaseverbinding 2 succesvol toegang krijgen tot de globale tijdelijke tabel ##Temp gemaakt door databaseverbinding 1, maar als we nu dataverbinding 1 sluiten en dan de ##Temp查询语句会发生什么呢 van databaseverbinding 2 uitvoeren? De resultaten zijn als volgt:

Sluit databaseverbinding 1, en dan voert databaseverbinding 2 opnieuw uit:



We ontdekten dat na het sluiten van databaseverbinding 1, databaseverbinding 2 de globale tijdelijke tabel ##Temp了 niet meer kan vinden. Dit komt doordat nadat de databaseverbinding 1 is gesloten, er geen instructie meer in databaseverbinding 2 is die de tijdelijke tabel ##Temp gebruikt, dus de sqlserver denkt dat er op dit moment geen databaseverbinding is die verwijst naar de globale tijdelijke tabel ##Temp了, dus zal hij ##Temp释放掉了.


Vervolgens proberen we de globale tijdelijke tabel ##Temp持有事务中的排他锁 (X-lock) in databaseverbinding 2 te sluiten en vervolgens databaseverbinding 1 te sluiten.

Databaseverbinding 1:



Databaseverbinding 2:



Sluit databaseverbinding 1, en dan voert databaseverbinding 2 uit:



Het resultaat toont aan dat hoewel we databaseverbinding 1 sluiten, omdat databaseverbinding 2 de globale tijdelijke tabel ##Temp的排他锁 (X-lock) in de transactie heeft vastgehouden, de tijdelijke tabel # #Temp并没有随着数据库连接1的关闭而被释放掉, zolang de transactie die in databaseverbinding 2 is gestart niet wordt teruggerolld of gecommit, databaseverbinding 2 altijd de tijdelijke tabel ##Temp的排他锁 zal bewaren. Op dit moment denkt Sqlserver dat er nog steeds een databaseverbinding is die verwijst naar de globale tijdelijke tabel ##Temp, dus ##Temp不会被释放掉.




Vorig:TypeScript-eigenschapsaccessor (set,get)
Volgend:SQL Server-query's de voorgaande dagen van de huidige systeemtijd
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com