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