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不会被释放掉. |