Tabele tymczasowe są bardzo ważne w bazie danych Sqlserver, a poniżej przedstawiono szczegółowe wprowadzenie do charakterystyki i zastosowania tabel tymczasowych w bazie SQL, wyłącznie jako referencja.
Tabele tymczasowe są podobne do tabel trwałych, ale tabele tymczasowe są przechowywane w tempdb i automatycznie usuwane, gdy przestają być używane. Istnieją dwa typy tabel tymczasowych: lokalne i globalne. Wyróżniają się ich nazwą, widocznością i dostępnością.
Tymczasowy stół ma następujące cechy:
- Lokalne tabele tymczasowe to tabele, do których użytkownicy dodają prefiks "#" podczas tworzenia tabel, a które są niezależne w zależności od połączeń z bazą danych. Dostęp do tabeli ma tylko połączenie bazy danych, które utworzyło lokalną tabelę tymczasową, a inne połączenia nie mają dostępu do tabeli.
- W różnych powiązaniach bazy danych, chociaż lokalne tymczasowe tabele mają tę samą "nazwę", te tabele nie mają ze sobą żadnych relacji. W SQLSERVER specjalny mechanizm nazewnictwa zapewnia niezależność lokalnych tabel tymczasowych w połączeniach bazy danych.
- Prawdziwe tymczasowe tabele wykorzystują tymczasową przestrzeń tabelową bazy danych, która jest automatycznie utrzymywana przez system bazodanowy, oszczędzając tym samym miejsce w tabeli. A ponieważ tymczasowa przestrzeń tabelowa zazwyczaj korzysta z pamięci wirtualnej, liczba operacji I/O na dysku twardym jest znacznie zmniejszona, co poprawia efektywność systemu.
- Tabela tymczasowa jest automatycznie opróżniana po zakończeniu transakcji lub sesji, więc nie musisz pamiętać o usuwaniu danych po ich wyczerpaniu.
Lokalne stoły tymczasowe
Nazwa lokalnej tabeli tymczasowej poprzedzona jest pojedynczym symbolem liczbowym (#); Są widoczne tylko dla bieżącego połączenia użytkownika (czyli połączenia tworzącego lokalną tabelę tymczasową); Jest on usuwany, gdy użytkownik rozłącza się z instancją SQL Server.
Na przykład tworzymy lokalną tabelę tymczasową w połączeniu z bazą danych za pomocą następującego polecenia: #Temp
Połączenie z bazą danych 1:
Następnie jednocześnie uruchom połączenie bazy danych 2, aby wykonać zapytanie #temp
Połączenie z bazą danych 2:
Zobaczmy, jaki jest wynik połączenia z bazą danych 2?
Połączenie z bazą danych 2:
Wyniki pokazują, że połączenie bazy danych 2 nie może znaleźć tabeli #Temp. Oznacza to, że tymczasowy #Temp tabeli jest widoczny tylko dla połączenia bazy danych 1, które go utworzyło, ale nie dla połączenia z bazą danych 2.
Globalna tabela tymczasowa
Nazwa globalnej tabeli tymczasowej poprzedzona jest dwoma symbolami liczbowymi (##) i jest widoczna dla wszystkich połączeń bazy danych po utworzeniu, a usuwana jest, gdy wszystkie połączenia bazy danych odnoszące się do tabeli zostaną odłączone od SQL Server.
Na przykład tworzymy globalną tabelę tymczasową ##Temp w połączeniu z bazą danych za pomocą następującego zalecenia, a następnie wstawiamy trzy wiersze danych
Połączenie z bazą danych 1:
Następnie zapytujemy ##Temp的数据 w połączeniu z bazą danych 2
Połączenie z bazą danych 2:
Wynik połączenia bazy danych 2 wygląda następująco
Połączenie z bazą danych 2:
Jak widać, połączenie bazy danych 2 może pomyślnie uzyskać dostęp do globalnej tabeli tymczasowej ##Temp utworzonej przez połączenie bazy danych 1, ale jeśli teraz zamkniemy połączenie danych 1 i wykonamy ##Temp查询语句会发生什么呢 połączenia bazy danych 2? Wyniki są następujące:
Zamknij połączenie bazy danych 1, a następnie połączenie z bazą danych 2 wykonuje się ponownie:
Stwierdziliśmy, że po zamknięciu połączenia bazy danych 1, połączenie bazy danych 2 nie może znaleźć globalnej tabeli tymczasowej ##Temp了. Dzieje się tak, ponieważ po zamknięciu połączenia bazy danych 1 nie ma w połączeniu z bazą danych 2 żadnego polecenia używającego tymczasowej tabeli ##Temp, więc sqlserver uważa, że nie ma połączenia bazowego odwołującego się do globalnej tabeli tymczasowej ##Temp了 w tym momencie, więc będzie ##Temp释放掉了.
Następnie próbujemy zamknąć globalną tabelę tymczasową ##Temp持有事务中的排他锁 (X-lock) w połączeniu bazy danych 2, a następnie zamknąć połączenie bazy danych 1.
Połączenie z bazą danych 1:
Połączenie z bazą danych 2:
Zamknij połączenie bazy danych 1, a następnie połączenie z bazą danych 2 wykonuje:
Wynik pokazuje, że chociaż zamykamy połączenie bazy danych 1, ponieważ połączenie bazy danych 2 przechowywało globalną tymczasową tablicę ##Temp的排他锁 (blokada X) w transakcji, to tabela tymczasowa # #Temp并没有随着数据库连接1的关闭而被释放掉, o ile transakcja rozpoczęta w połączeniu bazy 2 nie jest cofnięta ani zatwierdzona, to połączenie bazy danych 2 zawsze będzie zawierać tabelę tymczasową ##Temp的排他锁. W tym momencie Sqlserver będzie uważał, że nadal istnieje połączenie bazowe odwołujące się do globalnej tabeli tymczasowej ##Temp, czyli ##Temp不会被释放掉. |