Wann sollte ich eine Tabellenvariable vs temporäre Tabelle in SQL Server verwenden?
Lerne ich mehr details in der Tabelle variabel. Es sagt, dass die temp-Tabellen werden immer auf der Festplatte, und die table-Variablen sind im Speicher, das heißt, die Leistung der table-variable besser ist als temp-Tabelle, da die Tabelle variable verwendet, die weniger IO-Operationen als temp-Tabelle.
Aber manchmal, wenn es zu viele Datensätze in eine table-variable kann nicht sein, enthalten in Speicher, die table-variable wird auf der Festplatte wie die temp-Tabelle.
Aber ich weiß nicht, was die "zu viele Datensätze". 100.000 Datensätze? oder von 1000.000 Datensätze? Wie kann ich wissen, ob eine table-variable, die ich verwende, ist im Speicher oder auf der Festplatte? Gibt es irgendeine Funktion oder ein tool in SQL Server 2005 zu Messen die Skala der Tabelle variable oder lassen Sie mich wissen, wenn die Tabelle variable auf der Festplatte aus dem Speicher?
InformationsquelleAutor der Frage yman | 2012-08-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage zeigt, dass Sie erlag einige der häufigsten Missverständnissen im Zusammenhang mit table-Variablen und temporäre Tabellen.
Ich geschrieben habe eine Recht umfassende Antwort auf der DBA-Website Blick auf die Unterschiede zwischen den beiden Objekttypen. Auch diese Adressen Ihre Frage über CD vs Speicher (ich sehe keinen signifikanten Unterschied im Verhalten zwischen den beiden).
Bezüglich der Frage im Titel, aber, wenn, eine Tabelle zu verwenden variable vs eine lokale temporäre Tabelle, die Sie haben nicht immer die Wahl. In Funktionen, zum Beispiel, ist es nur möglich, eine Tabelle zu verwenden Variablen und wenn Sie schreiben müssen, um die Tabelle in einen untergeordneten Bereich dann nur ein
#temp
Tabelle tun(Tabellenwert-Parameter erlauben readonly-Zugriff).
Wo Sie die Wahl haben, einige Vorschläge sind unten (obwohl die zuverlässigste Methode ist, einfach test sowohl mit Ihrer spezifischen workload).
UNIQUE
oderPRIMARY KEY
Einschränkung, dann müssen Sie einen#temporary
Tabelle, da es nicht möglich ist, diese auf table-Variablen. (Beispiele für solche Indizes sind nicht eindeutig diejenigen, gefilterte Indizes oder Indizes mitINCLUDE
d-Spalten). NB: SQL Server 2014 wird, dass nicht-eindeutige Indizes erklärt werden inline für table-Variablen.#temporary
Tabelle. UnterstütztTRUNCATE
(das ist effizienter alsDELETE
für große Tabellen) und zusätzlich nachfolgende Einfügungen nach einerTRUNCATE
können, haben eine bessere performance als diejenigen, die nach einerDELETE
wie hier abgebildet.#temporary
Tabelle. Das unterstützt die Erstellung von Statistiken, der ermöglicht, den plan dynamisch neu kompiliert nach den Daten (obwohl für zwischengespeicherte temporäre Tabellen in einer gespeicherten Prozedur die Neukompilierung Verhalten verstanden werden muss separat bestellt werden).SELECT
Aussage dann noch bedenkt, dass die Verwendung einer Tabelle für eine variable-block die Möglichkeit, dies unter Verwendung eines parallelen plans.#temp
Tabelle innerhalb einer Benutzer-Transaktion sperren gehalten werden kann, länger als für table-Variablen (möglicherweise bis zum Ende der Transaktion vs. Ende-Anweisung abhängig von der Art der Sperre und isolation-level) und es kann auch verhindern, dass die Kürzung destempdb
Transaktionsprotokoll, bis der Benutzer die Transaktion endet. So könnte dies begünstigen die Verwendung von table-Variablen.#temporary
Tabellen. Bob Ward weist in seinemtempdb
Präsentation , dies kann zu zusätzlichen Konflikten auf system-Tabellen unter den Bedingungen der hohen Parallelität. Darüber hinaus beim Umgang mit kleinen Mengen von Daten kann einen messbaren Unterschied bei der Leistung.Auswirkungen von rowset-sharing
InformationsquelleAutor der Antwort Martin Smith
Verwenden Tabelle variablewenn für Sie eine sehr kleine Menge von Daten (Tausende von bytes)
Verwenden temporäre Tabelle für eine Menge von Daten
Einer anderen Weise zu denken: wenn Sie denken, Sie könnten profitieren von einem index, automatisierte Statistiken, oder irgendwelche SQL-Optimierer Güte, dann wird Ihr Datensatz ist wahrscheinlich zu groß für eine table-variable.
In meinem Beispiel, ich wollte nur ungefähr 20 Zeilen in ein format und ändern Sie Sie als Gruppe, bevor Sie Sie verwenden, um UPDATE /INSERT eine permanente Tabelle. So eine table-variable ist perfekt.
Aber ich bin auch mit SQL zu back-füllen Tausende von Zeilen zu einem Zeitpunkt, und ich kann definitiv sagen, dass die temporären Tabellen durchführen viel besser als table-Variablen.
Dies ist nicht anders als wie WAK-s eine Sorge für eine ähnliche Größe Grund -, wenn die Daten in der CTE ist sehr klein, ich finde eine CTE führt so gut wie oder besser als das, was der optimizer kommt mit, aber wenn es ganz groß ist, dann schadet es Ihnen schlecht.
Mein Verständnis basiert hauptsächlich auf http://www.developerfusion.com/article/84397/table-variables-v-temporary-tables-in-sql-server/die hat eine Menge mehr detail.
InformationsquelleAutor der Antwort Abacus
Microsoft hier sagt
InformationsquelleAutor der Antwort Paul Sturm
Ich bin völlig einverstanden mit Abacus (sorry - habe nicht genug Punkte, um einen Kommentar).
Bedenken Sie auch, es muss nicht unbedingt nach unten kommen, um wie viele Datensätze, die Sie haben, aber die Größe Ihre Aufzeichnungen.
Zum Beispiel, haben Sie berücksichtigt den Unterschied in der Leistung zwischen 1.000 Datensätze mit 50 Spalten jede vs 100.000 Datensätze mit nur 5 Spalten?
Schließlich, vielleicht bist du Abfragen/speichern von mehr Daten, als Sie benötigen? Hier ist gut zu Lesen auf SQL-Optimierung Strategien. Begrenzen Sie die Menge der Daten, die Sie ziehen, vor allem, wenn Sie Sie nicht verwenden alle (einige SQL-Programmierer tun, faul zu bekommen und wählen Sie einfach alles, obwohl Sie nur eine winzige Teilmenge). Vergessen Sie nicht die SQL-query-analyzer kann auch dein bester Freund geworden.
InformationsquelleAutor der Antwort Do What You Love
Variable Tabelle ist nur für die aktuelle Sitzung, zum Beispiel, wenn Sie brauchen, um
EXEC
einer anderen gespeicherten Prozedur in der aktuellen eine, die Sie haben, um die Tabelle alsTable Valued Parameter
- und natürlich wird dies Auswirkungen auf die Leistung, mit temporäre Tabellen Sie können dies tun, mit nur übergeben die temporäre Tabelle namensZu testen, eine Temporäre Tabelle:
Zu testen, eine Variable Tabelle:
Etwas, was ich erlebt habe, ist: Wenn Sie in Ihrem schema nicht
GRANT
Berechtigung zum erstellen von Tabellen verwenden Sie dann die variable Tabellen. Außerdem werden die temporären Tabellen befindet sich in der tempdb-Datenbank und die Tabelle Variablen kann sich auf die beiden Speicher und die Festplatte der tempdb-Datenbank. Siehe hier: https://www.linkedin.com/pulse/highlighted-differences-between-sql-server-temporary-tables-andrewInformationsquelleAutor der Antwort Mina Gabriel
schreiben von Daten in Tabellen erklärt
declare @tb
und nach dem verknüpfen mit anderen Tabellen, erkannte ich, dass die Reaktionszeit im Vergleich zu temporären Tabellentempdb .. # tb
ist viel höher.Wenn ich an Ihnen mit @tb die Zeit ist viel mehr das Ergebnis zurückgeben, im Gegensatz zu #tmdie Rückkehr ist fast augenblicklich.
Habe ich tests mit einem 10.000 Zeilen join und der join mit 5 anderen Tabellen
InformationsquelleAutor der Antwort César Augusto