Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was ist der Unterschied zwischen einer temporären Tabelle und einer Tabellenvariablen in SQL Server?

Es gibt ein paar Unterschiede zwischen temporären Tabellen (#tmp) und Tabellenvariablen (@tmp), obwohl die Verwendung von tempdb keiner davon ist, wie im MSDN-Link unten beschrieben.

Als Faustregel gilt, dass Sie für kleine bis mittlere Datenmengen und einfache Anwendungsszenarien Tabellenvariablen verwenden sollten. (Dies ist eine zu weit gefasste Richtlinie mit natürlich vielen Ausnahmen – siehe unten und die folgenden Artikel.)

Einige Punkte, die bei der Auswahl zwischen ihnen zu beachten sind:

  • Temporäre Tabellen sind echte Tabellen, so dass Sie Dinge wie CREATE INDEXes usw. tun können. Wenn Sie große Datenmengen haben, bei denen der Zugriff per Index schneller ist, dann sind temporäre Tabellen eine gute Option.

  • Tabellenvariablen können Indizes haben, indem PRIMARY KEY- oder UNIQUE-Einschränkungen verwendet werden. (Wenn Sie einen nicht eindeutigen Index wünschen, schließen Sie einfach die Primärschlüsselspalte als letzte Spalte in die eindeutige Einschränkung ein. Wenn Sie keine eindeutige Spalte haben, können Sie eine Identitätsspalte verwenden.) SQL 2014 hat auch nicht eindeutige Indizes .

  • Tabellenvariablen nehmen nicht an Transaktionen und SELECT teil s sind implizit mit NOLOCK . Das Transaktionsverhalten kann sehr hilfreich sein, wenn Sie beispielsweise mitten in einer Prozedur ein ROLLBACK durchführen möchten, dann werden Tabellenvariablen, die während dieser Transaktion gefüllt wurden, weiterhin gefüllt!

  • Temp-Tabellen können dazu führen, dass gespeicherte Prozeduren möglicherweise häufig neu kompiliert werden. Tabellenvariablen nicht.

  • Sie können eine temporäre Tabelle mit SELECT INTO erstellen, die schneller geschrieben werden kann (gut für Ad-hoc-Abfragen) und es Ihnen möglicherweise ermöglicht, mit sich ändernden Datentypen im Laufe der Zeit umzugehen, da Sie Ihre temporäre Tabellenstruktur nicht im Voraus definieren müssen.

  • Sie können Tabellenvariablen von Funktionen zurückgeben, was es Ihnen ermöglicht, Logik viel einfacher zu kapseln und wiederzuverwenden (z. B. eine Funktion zu erstellen, um einen String an einem beliebigen Trennzeichen in eine Wertetabelle aufzuteilen).

  • Durch die Verwendung von Tabellenvariablen innerhalb benutzerdefinierter Funktionen können diese Funktionen umfassender verwendet werden (Einzelheiten finden Sie in der Dokumentation zu CREATE FUNCTION). Wenn Sie eine Funktion schreiben, sollten Sie Tabellenvariablen anstelle von temporären Tabellen verwenden, es sei denn, es besteht ein zwingender anderer Bedarf.

  • Sowohl Tabellenvariablen als auch temporäre Tabellen werden in tempdb gespeichert. Tabellenvariablen (seit 2005) verwenden jedoch standardmäßig die Sortierung der aktuellen Datenbank im Vergleich zu temporären Tabellen, die die Standardsortierung von tempdb (ref) verwenden. Das bedeutet, dass Sie Kollationsprobleme beachten sollten, wenn Sie temporäre Tabellen verwenden und Ihre db-Sortierung sich von der tempdb unterscheidet, was zu Problemen führt, wenn Sie Daten in der temporären Tabelle mit Daten in Ihrer Datenbank vergleichen möchten.

  • Globale temporäre Tabellen (##tmp) sind eine weitere Art von temporären Tabellen, die allen Sitzungen und Benutzern zur Verfügung stehen.

Etwas weiterführende Lektüre:

  • Martin Smiths großartige Antwort auf dba.stackexchange.com

  • MSDN-FAQ zum Unterschied zwischen den beiden:https://support.microsoft.com/en-gb/kb/305977

  • MDSN-Blogartikel:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table

  • Artikel:https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables

  • Unerwartetes Verhalten und Auswirkungen auf die Leistung von temporären Tabellen und temporären Variablen:Paul White auf SQLblog.com