Temporäre Tabellen sind in der SQL-Server-Datenbank sehr wichtig, und im Folgenden finden Sie eine ausführliche Einführung in die Eigenschaften und Nutzung temporärer Tabellen in SQL-Datenbanken, ausschließlich zur Referenz.
Temporäre Tabellen ähneln persistenten Tabellen, aber temporäre Tabellen werden in tempdb gespeichert und automatisch gelöscht, wenn sie nicht mehr verwendet werden. Es gibt zwei Arten von temporären Tabellen: lokale und globale. Sie unterscheiden sich durch Namen, Sichtbarkeit und Verfügbarkeit.
Die temporäre Tabelle weist folgende Eigenschaften auf:
- Lokale temporäre Tabellen sind Tabellen, die Benutzer beim Erstellen von Tabellen mit dem Präfix "#" hinzufügen, die je nach Datenbankverbindung unabhängig sind. Nur die Datenbankverbindung, die die lokale temporäre Tabelle erstellt hat, hat Zugriff auf die Tabelle, und andere Verbindungen können nicht auf die Tabelle zugreifen.
- In verschiedenen Datenbankverbindungen haben die erstellten lokalen temporären Tabellen zwar denselben "Namen", aber diese Tabellen stehen in keiner Beziehung zueinander. In SQLSERVER sorgt ein spezieller Benennungsmechanismus für die Unabhängigkeit lokaler temporärer Tabellen in Datenbankverbindungen.
- Echte temporäre Tabellen nutzen den temporären Datenbank-Tabellenraum, der automatisch vom Datenbanksystem verwaltet wird und so Tabellenplatz spart. Und da der temporäre Tabellenraum im Allgemeinen virtuellen Speicher verwendet, wird die Anzahl der I/O-Adressen auf der Festplatte stark reduziert, sodass auch die Systemeffizienz verbessert wird.
- Die temporäre Tabelle wird nach Abschluss der Transaktion oder Sitzung automatisch geleert, sodass du nicht daran denken musst, die Daten nach Ablauf zu löschen.
Lokale temporäre Tabellen
Der Name der lokalen temporären Tabelle wird mit einem einzigen numerischen Symbol (#) vorangestellt; Sie sind nur für die aktuelle Benutzerverbindung sichtbar (d. h. die Verbindung, die die lokale temporäre Tabelle erstellt); Sie wird gelöscht, wenn ein Benutzer die Verbindung zu einer SQL-Server-Instanz trennt.
Zum Beispiel erstellen wir eine lokale temporäre Tabelle in einer Datenbankverbindung mit folgender Anweisung: #Temp
Datenbankverbindung 1:
Dann starten Sie gleichzeitig die Datenbankverbindung 2, um die Abfrage #temp
Datenbankverbindung 2:
Schauen wir mal, was das Ergebnis von Datenbankverbindung 2 ist?
Datenbankverbindung 2:
Die Ergebnisse zeigen, dass Datenbankverbindung 2 Tabelle #Temp nicht finden kann. Das bedeutet, dass die temporäre Tabelle #Temp nur für die Datenbankverbindung 1 sichtbar ist, die sie erstellt hat, aber nicht für die Datenbankverbindung 2.
Globale temporäre Tabelle
Der Name einer globalen temporären Tabelle wird mit zwei numerischen Symbolen (##) vorangestellt und ist bei Erstellung für alle Datenbankverbindungen sichtbar; er wird entfernt, wenn alle Datenbankverbindungen, die sich auf die Tabelle beziehen, vom SQL Server getrennt werden.
Zum Beispiel erstellen wir eine globale temporäre Tabelle ##Temp in einer Datenbankverbindung mit folgender Anweisung und fügen dann drei Datenzeilen ein
Datenbankverbindung 1:
Dann fragen wir ##Temp的数据 in Datenbankverbindung 2 ab
Datenbankverbindung 2:
Das Ergebnis der Datenbankverbindung 2 ist wie folgt
Datenbankverbindung 2:
Wie Sie sehen, kann Datenbankverbindung 2 erfolgreich auf die globale temporäre Tabelle ##Temp zugreifen, die von Datenbankverbindung 1 erstellt wurde, aber wenn wir jetzt Datenverbindung 1 schließen und dann die ##Temp查询语句会发生什么呢 von Datenbankverbindung 2 ausführen? Die Ergebnisse sind wie folgt:
Schließen Sie Datenbankverbindung 1, und dann wird Datenbankverbindung 2 erneut ausgeführt:
Wir stellten fest, dass nach dem Schließen der Datenbankverbindung 1 Datenbankverbindung 2 die globale temporäre Tabelle ##Temp了 nicht mehr finden kann. Das liegt daran, dass nach dem Schließen der Datenbankverbindung 1 keine Anweisung in der Datenbankverbindung 2 mehr vorhanden ist, die die temporäre Tabelle ##Temp verwendet, sodass der SQL-Server annimmt, dass es derzeit keine Datenbankverbindung gibt, die auf die globale temporäre Tabelle ##Temp了 verweist, also wird er ##Temp释放掉了.
Als Nächstes versuchen wir, die globale Temp-Tabelle ##Temp持有事务中的排他锁 (X-Lock) in Datenbankverbindung 2 zu schließen und dann Datenbankverbindung 1 zu schließen.
Datenbankverbindung 1:
Datenbankverbindung 2:
Schließen Sie Datenbankverbindung 1, und dann führt Datenbankverbindung 2 aus:
Das Ergebnis zeigt, dass obwohl wir Datenbankverbindung 1 schließen, weil Datenbankverbindung 2 die globale temporäre Tabelle ##Temp的排他锁 (X-Sperre) in der Transaktion, die temporäre Tabelle # #Temp并没有随着数据库连接1的关闭而被释放掉, gehalten hat, die temporäre Tabelle # , solange die in der Datenbankverbindung 2 gestartete Transaktion nicht zurückgesetzt oder committed wird, Datenbankverbindung 2 immer die temporäre Tabelle ##Temp的排他锁 halten wird. Zu diesem Zeitpunkt wird Sqlserver annehmen, dass es noch eine Datenbankverbindung gibt, die auf die globale temporäre Tabelle ##Temp verweist, also ##Temp不会被释放掉. |