Ich habe eine große benutzerdefinierte Tabellentypvariable mit 129 Spalten. Ich werde ungefähr 2000-3000 Datensätze gleichzeitig in dieser Tabellenvariablen speichern und an verschiedene gespeicherte Prozeduren und Funktionen übergeben, um zusätzliche Daten zu erhalten und Änderungen vorzunehmen. Diese zusätzlichen Daten und neuen Änderungen werden dann in einer neuen Tabellenvariablen desselben Typs gespeichert und über einen OUTPUT
Parameter an die gespeicherte Quellprozedur zurückgegeben . (Dies liegt daran, dass ein Tabellentypparameter nur als übergeben werden kann READONLY
.)
Das ist mein Pseudocode:
SP1
@tmp tableType
{
INSERT @tmp EXEC
SP2 (@tmp)
INSERT @tmp EXEC
SP3 (@tmp)
}
Soll ich ein @table_variable
oder verwenden #temp_table
?
sql-server
sql-server-2008
performance
Sreekumar P.
quelle
quelle
Antworten:
Es gibt zwei Blogs, die Sie sich ansehen sollten. Die erste ( hier ) ist ein Vergleich von Tabellenvariablen und temporären Tabellen. Es stammt aus dem Jahr 2008 und bleibt für SQL Server 2008 R2 relevant.
Der zweite Blogeintrag ( hier ) befasst sich mit einigen Missverständnissen (Fehlvorstellungen) in Bezug auf Tabellenvariablen; einschließlich der Indizierung einer Tabellenvariablen.
Beide Blogeinträge, Artikel, wurden von Gail Shaw geschrieben.
Ich glaube, das einzige aussagekräftige Element, nach dem Sie suchen, ist, dass eine Tabellenvariable möglicherweise nicht zwischen gespeicherten Prozeduren übergeben werden kann, während eine temporäre Tabelle zwischen gespeicherten Prozeduren übergeben werden kann. Eine Tabellenvariable kommt der Übergabe zwischen gespeicherten Prozeduren am nächsten, wenn es sich um einen benutzerdefinierten Tabellentyp handelt.
Das Übergeben einer Tabellenvariablen als TVP an eine gespeicherte Prozedur setzt voraus, dass sie als READ-ONLY-Parameter definiert ist. Dies bedeutet, dass mehrere Kopien der Tabellenvariablen vorhanden sind, wenn Sie eine geänderte Kopie davon zurückgeben möchten.
Alles in allem kann die Übergabe zwischen gespeicherten Prozeduren besser von einer temporären Tabelle bedient werden, wenn Sie die übergebene Struktur mit aktualisierten Werten zurückgeben möchten.
quelle
Nichts ist besser als beides zu versuchen, aber ich finde, dass #tempTables eine bessere Leistung erzielen, wenn Sie erst einmal Hunderte von Datensätzen erreicht haben.
quelle