Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 11952|Odpoveď: 0

[Zdroj] Podrobné vysvetlenie dočasných tabuliek v databázach SQL serverov

[Kopírovať odkaz]
Zverejnené 28. 5. 2020 10:52:28 | | | |
Dočasné tabuľky sú v databáze Sqlserver veľmi dôležité a nasleduje podrobný úvod do charakteristík a použitia dočasných tabuliek v SQL databáze, len na referenciu.

Dočasné tabuľky sú podobné trvalým tabuľkám, ale dočasné tabuľky sú uložené v tempdb a automaticky sa vymazávajú, keď už nie sú používané. Existujú dva typy dočasných tabuliek: lokálne a globálne. Odlišujú sa podľa názvu, viditeľnosti a dostupnosti.

Dočasná tabuľka má nasledujúce vlastnosti:

  • Lokálne dočasné tabuľky sú tabuľky, do ktorých používatelia pridávajú predponu "#" pri vytváraní tabuliek, ktoré sú nezávislé podľa prepojenia s databázou. Iba databázové pripojenie, ktoré vytvorilo lokálnu dočasnú tabuľku, má prístup k tabuľke a iné pripojenia k tabuľke nemajú prístup.
  • Pri rôznych databázových pripojeniach, hoci lokálne dočasné tabuľky majú rovnaký "názov", tieto tabuľky medzi sebou nemajú žiadny vzťah. V SQLSERVER špeciálny mechanizmus pomenovania zabezpečuje nezávislosť lokálnych dočasných tabuliek v databázových pripojeniach.
  • Skutočné dočasné tabuľky využívajú dočasný priestor v databáze, ktorý je automaticky udržiavaný databázovým systémom, čím šetrí miesto v tabuľke. A keďže dočasný stolový priestor zvyčajne používa virtuálnu pamäť, počet vstupov/výstupov na pevnom disku je výrazne znížený, čím sa zvyšuje aj efektivita systému.
  • Dočasná tabuľka sa automaticky vyprázdni po skončení transakcie alebo relácie, takže nemusíte pamätať na vymazanie dát po ich vyčerpaní.


Miestne dočasné tabuľky

Názov lokálnej dočasnej tabuľky je predponou jediného číselného symbolu (#); Sú viditeľné iba pre aktuálne používateľské pripojenie (t. j. spojenie, ktoré vytvára lokálnu dočasnú tabuľku); Je vymazaný, keď sa používateľ odpojí od inštancie SQL Servera.

Napríklad vytvoríme lokálnu dočasnú tabuľku v databázovom spojení s nasledujúcim príkazom: #Temp

Pripojenie k databáze 1:



Potom súčasne spustím databázové pripojenie 2, aby som vykonal dotaz #temp

Pripojenie k databáze 2:



Pozrime sa, aký je výsledok databázového pripojenia 2?

Pripojenie k databáze 2:



Výsledky ukazujú, že databázové pripojenie 2 nedokáže nájsť tabuľku #Temp. To znamená, že dočasný #Temp tabuľky je viditeľný iba pre databázové pripojenie 1, ktoré ho vytvorilo, ale nie pre databázové pripojenie 2.

Globálna dočasná tabuľka

Názov globálnej dočasnej tabuľky je predponou dvoch číselných symbolov (##) a je viditeľný pre akékoľvek databázové pripojenia pri vytvorení, pričom je odstránený, keď sú všetky databázové spojenia odkazujúce na tabuľku odpojené od SQL Serveru.

Napríklad vytvoríme globálnu dočasnú tabuľku ##Temp v databázovom spojení s nasledujúcim príkazom a potom vložíme tri riadky dát

Pripojenie k databáze 1:



Potom sa dotazujeme na ##Temp的数据 v databázovom spojení 2

Pripojenie k databáze 2:



Výsledok pripojenia k databáze 2 je nasledovný

Pripojenie k databáze 2:



Ako vidíte, databázové pripojenie 2 úspešne pristupuje k globálnej dočasnej tabuľke ##Temp vytvorenej databázovým pripojením 1, ale ak teraz uzavrieme dátové pripojenie 1 a potom vykonáme ##Temp查询语句会发生什么呢 databázového pripojenia 2? Výsledky sú nasledovné:

Zatvorte pripojenie k databáze 1 a potom sa opäť spustí pripojenie k databáze 2:



Zistili sme, že po uzavretí databázového pripojenia 1 nemôže databázové pripojenie 2 nájsť globálnu dočasnú tabuľku ##Temp了. Je to preto, že po uzavretí databázového pripojenia 1 nie je v databázovom spojení 2 žiadny príkaz, ktorý by používal dočasnú tabuľku ##Temp, takže sqlserver si myslí, že v tomto čase neexistuje žiadne databázové spojenie odkazujúce na globálnu dočasnú tabuľku ##Temp了, takže bude ##Temp释放掉了.


Ďalej sa snažíme zatvoriť globálnu dočasnú tabuľku ##Temp持有事务中的排他锁 (X-lock) v databázovom pripojení 2 a potom uzavrieť databázové pripojenie 1.

Pripojenie k databáze 1:



Pripojenie k databáze 2:



Zatvorte databázové pripojenie 1 a potom sa spustí databázové pripojenie 2:



Výsledok ukazuje, že hoci uzatvárame databázové pripojenie 1, pretože databázové pripojenie 2 držalo globálnu dočasnú tabuľku ##Temp的排他锁 (X zámok) v transakcii, dočasná tabuľka # #Temp并没有随着数据库连接1的关闭而被释放掉, pokiaľ transakcia začatá v databázovom spojení 2 nie je vrátená späť alebo potvrdená, potom databázové pripojenie 2 vždy uchováva dočasnú tabuľku ##Temp的排他锁. V tomto momente si Sqlserver bude myslieť, že stále existuje databázové spojenie odkazujúce na globálnu dočasnú tabuľku ##Temp, teda ##Temp不会被释放掉.




Predchádzajúci:TypeScript property accessor (set,get)
Budúci:SQL Server sa pýta na predchádzajúce dni aktuálneho systémového času
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com