See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 11952|Vastuse: 0

[Allikas] Üksikasjalik selgitus ajutiste tabelite kohta SQL serveri andmebaasides

[Kopeeri link]
Postitatud 28.05.2020 10:52:28 | | | |
Ajutised tabelid on Sqlserveri andmebaasis väga olulised ning järgnevalt on üksikasjalik sissejuhatus ajutiste tabelite omadustesse ja kasutusse SQL-andmebaasis, ainult viitamiseks.

Ajutised tabelid on sarnased püsitabelitele, kuid ajutised tabelid salvestatakse tempdb-sse ja kustutatakse automaatselt, kui neid enam ei kasutata. Ajutisi tabeleid on kahte tüüpi: kohalikud ja globaalsed. Neid eristatakse nime, nähtavuse ja kättesaadavuse poolest.

Ajutisel tabelil on järgmised omadused:

  • Kohalikud ajutised tabelid on tabelid, millele kasutajad lisavad tabelite loomisel "#" eesliite, mis on sõltumatud vastavalt andmebaasi ühendustele. Tabelile pääseb ligi ainult andmebaasi ühendus, mis lõi kohaliku ajutise tabeli, ja teised ühendused ei pääse tabelile ligi.
  • Erinevates andmebaasiühendustes, kuigi loodud kohalikel ajutistel tabelitel on sama "nimi", ei ole neil omavahel mingit seost. SQLSERVERIS tagab spetsiaalne nimetamismehhanism kohalike ajutiste tabelite sõltumatuse andmebaasi ühendustes.
  • Tõelised ajutised tabelid kasutavad ära andmebaasi ajutist tabeliruumi, mida andmebaasisüsteem automaatselt haldab, säästes seeläbi tabeliruumi. Ja kuna ajutine tabeliruum kasutab üldiselt virtuaalmälu, väheneb kõvaketta I/O-de arv märkimisväärselt, mistõttu on süsteemi efektiivsus samuti paranenud.
  • Ajutine tabel tühjendatakse automaatselt pärast tehingu või sessiooni lõppu, nii et sa ei pea meeles pidama andmeid kustutada, kui need lõppevad.


Kohalikud ajutised tabelid

Kohaliku ajutise tabeli nime ees on üks numbriline sümbol (#); Need on nähtavad ainult praegusele kasutaja ühendusele (st ühendusele, mis loob kohaliku ajutise tabeli); See kustutatakse, kui kasutaja katkestab ühenduse SQL Serveri instantsiga.

Näiteks loome andmebaasi ühenduses kohaliku ajutise tabeli järgmise lausega: #Temp

Andmebaasi ühendus 1:



Seejärel käivita korraga andmebaasi ühendus 2, et teha päring #temp

Andmebaasi ühendus 2:



Vaatame, mis on andmebaasiühenduse 2 tulemus?

Andmebaasi ühendus 2:



Tulemused näitavad, et andmebaasi ühendus 2 ei leia tabelit #Temp. See tähendab, et ajutine tabel #Temp on nähtav ainult andmebaasi ühendusele 1, mis selle lõi, kuid mitte andmebaasi ühendusele 2.

Globaalne ajutine tabel

Globaalse ajutise tabeli nimi on eesliides kahe numbrilise sümboliga (##) ning see on nähtav igale andmebaasi ühendusele loomisel ning eemaldatakse, kui kõik tabelile viitavad andmebaasiühendused on SQL Serverist lahti ühendatud.

Näiteks loome andmebaasi ühenduses globaalse ajutise tabeli ##Temp järgmise lausega ja seejärel lisame kolm andmerida

Andmebaasi ühendus 1:



Seejärel pärime ##Temp的数据 andmebaasi ühenduses 2

Andmebaasi ühendus 2:



Andmebaasi ühenduse 2 tulemus on järgmine

Andmebaasi ühendus 2:



Nagu näha, saab andmebaasi ühendus 2 edukalt ligi globaalsele ajutisele tabelile ##Temp, mille on loonud andmebaasiühendus 1, kuid kui sulgeme andmeühenduse 1 nüüd ja siis käivitame andmebaasiühenduse 2 ##Temp查询语句会发生什么呢? Tulemused on järgmised:

Sulge andmebaasi ühendus 1 ja seejärel käivitatakse andmebaasi ühendus 2 uuesti:



Leidsime, et pärast andmebaasi ühenduse 1 sulgemist ei leia ühendus 2 globaalset ajutist tabelit ##Temp了. See on sellepärast, et pärast andmebaasi ühenduse 1 sulgemist ei ole andmebaasi ühenduses 2 ühtegi avaldust, mis kasutaks ajutist tabelit ##Temp, seega sqlserver arvab, et praegu puudub andmebaasiühendus, mis viitaks globaalsele ajutisele tabelile ##Temp了, seega teeb ta ##Temp释放掉了.


Seejärel proovime sulgeda globaalse ajutiste tabeli ##Temp持有事务中的排他锁 (X-lock) andmebaasi ühenduses 2 ja seejärel sulgeda andmebaasi ühendus 1.

Andmebaasi ühendus 1:



Andmebaasi ühendus 2:



Sulge andmebaasi ühendus 1 ja seejärel käivitab andmebaasiühendus 2:



Tulemus näitab, et kuigi sulgeme andmebaasi ühenduse 1, kuna andmebaasi ühendus 2 on hoidnud globaalset ajutist tabelit ##Temp的排他锁 (X lukk) tehingus, ajutist tabelit # #Temp并没有随着数据库连接1的关闭而被释放掉, kui andmebaasi ühenduses 2 alanud tehing ei ole tagasi keeratud ega kinnitatud, siis andmebaasi ühendus 2 hoiab alati ajutist tabelit ##Temp的排他锁. Praegu arvab Sqlserver, et on endiselt olemas andmebaasiühendus, mis viitab globaalsele temperatuuritabelile ##Temp, seega ##Temp不会被释放掉.




Eelmine:TypeScript omaduse accessor (set,get)
Järgmine:SQL Server pärib käesoleva süsteemi aja eelnevaid päevi
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com