Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 11952|Odgovoriti: 0

[Vir] Podrobna razlaga začasnih tabel v SQL strežniških bazah podatkov

[Kopiraj povezavo]
Objavljeno na 28. 05. 2020 10:52:28 | | | |
Začasne tabele so zelo pomembne v bazi podatkov SQL Server, spodaj pa je podroben uvod v značilnosti in uporabo začasnih tabel v SQL bazi, zgolj za referenco.

Začasne tabele so podobne trajnim tabelam, vendar so začasne tabele shranjene v tempdb in se samodejno izbrišejo, ko niso več v uporabi. Obstajata dve vrsti začasnih tabel: lokalna in globalna. Razlikujejo se po imenu, vidnosti in razpoložljivosti.

Začasna miza ima naslednje značilnosti:

  • Lokalne začasne tabele so tabele, v katere uporabniki ob ustvarjanju tabel dodajo predpono "#", ki so neodvisne glede na povezave z bazo podatkov. Dostop do tabele ima le povezava z bazo podatkovne baze, ki je ustvarila lokalno začasno tabelo, druge povezave pa ne morejo dostopati do tabele.
  • Pri različnih povezavah z bazo podatkov, čeprav imajo ustvarjene lokalne začasne tabele enako "ime", te tabele med seboj nimajo nobene povezave. V SQLSERVER-ju poseben mehanizem poimenovanja zagotavlja neodvisnost lokalnih začasnih tabel v povezavah z bazo podatkov.
  • Prave začasne tabele izkoriščajo začasni tabelni prostor baze podatkov, ki ga sistem baze samodejno vzdržuje, s čimer prihrani prostor v tabeli. Ker začasni mizni prostor običajno uporablja virtualni pomnilnik, se število vhodnih in izhodnih povezav na trdem disku močno zmanjša, zato se izboljša tudi učinkovitost sistema.
  • Začasna tabela se samodejno izprazni po koncu transakcije ali seje, tako da vam ni treba več zapomniti izbrisati podatkov, ko se zmanjka.


Lokalne začasne tabele

Ime lokalne začasne tabele je predpona z enim številčnim simbolom (#); Vidni so le trenutni uporabniški povezavi (tj. povezavi, ki ustvari lokalno začasno tabelo); Izbriše se, ko uporabnik prekine povezavo s SQL Server instanco.

Na primer, ustvarimo lokalno začasno tabelo v povezavi z bazo podatkov z naslednjo izjavo: #Temp

Povezava z bazo podatkov 1:



Nato hkrati zaženi povezavo z bazo podatkov 2 za izvedbo poizvedbe#temp

Povezava z bazo podatkov 2:



Poglejmo, kakšen je rezultat povezave z bazo podatkov 2?

Povezava z bazo podatkov 2:



Rezultati kažejo, da podatkovna povezava 2 ne more najti tabele #Temp. To pomeni, da je začasna tabela #Temp vidna le povezavi z bazo 1, ki jo je ustvarila, ne pa povezavi z bazo 2.

Globalna začasna tabela

Ime globalne začasne tabele ima predpono dveh številčnih simbolov (##) in je vidno vsem povezavam z bazo podatkov, ko je ustvarjena, ter se odstrani, ko so vse povezave podatkovne baze, ki se nanašajo na tabelo, odklopljene od SQL Serverja.

Na primer, ustvarimo globalno začasno tabelo ##Temp v povezavi z bazo podatkov z naslednjim ukazom in nato vnesemo tri vrstice podatkov

Povezava z bazo podatkov 1:



Nato povprašamo ##Temp的数据 v povezavi z bazo podatkov 2

Povezava z bazo podatkov 2:



Rezultat povezave z bazo podatkov 2 je naslednji

Povezava z bazo podatkov 2:



Kot vidite, lahko podatkovna povezava 2 uspešno dostopa do globalne začasne tabele ##Temp ustvarjene z bazo 1, vendar če zdaj zapremo podatkovno povezavo 1 in nato izvedemo ##Temp查询语句会发生什么呢 podatkovne povezave 2? Rezultati so naslednji:

Zapri povezavo z bazo podatkov 1, nato se ponovno izvede povezava z bazo podatkov 2:



Ugotovili smo, da po zaprtju povezave z bazo 1 povezava z bazo podatkov 2 ne more najti globalne začasne tabele ##Temp了. To je zato, ker po zaprtju povezave z bazo 1 v povezavi z bazo 2 ni nobenega stavka, ki bi uporabljal začasno tabelo ##Temp, zato sqlserver misli, da trenutno ni povezave z bazo podatkov, ki bi se sklicevala na globalno začasno tabelo ##Temp了, zato bo ##Temp释放掉了.


Nato poskušamo zapreti globalno začasno tabelo ##Temp持有事务中的排他锁 (X-lock) v povezavi 2 in nato zapreti povezavo z bazo 1.

Povezava z bazo podatkov 1:



Povezava z bazo podatkov 2:



Zaprete povezavo z bazo 1, nato pa se vzpostavi povezava z bazo 2:



Rezultat kaže, da čeprav zapremo povezavo z bazo 1, ker je povezava z bazo 2 v transakciji hranila globalno začasno tabelo ##Temp的排他锁 (X zaklep) v transakciji, začasna tabela # #Temp并没有随着数据库连接1的关闭而被释放掉, dokler transakcija, začeta v povezavi z bazo 2, ni povrnjena ali potrjena, bo povezava z bazo 2 vedno hranila začasno tabelo ##Temp的排他锁. V tem trenutku bo Sqlserver menil, da še vedno obstaja povezava z bazo podatkov, ki se sklicuje na globalno začasno tabelo ##Temp, torej ##Temp不会被释放掉.




Prejšnji:TypeScript property accessor (set,get)
Naslednji:SQL Server poizveduje prejšnje dni trenutnega sistemskega časa
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com