@table_variable oder #temp_table

11

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 OUTPUTParameter 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_variableoder verwenden #temp_table?

Sreekumar P.
quelle

Antworten:

12

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.

Robert Miller
quelle
5

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.

SqlACID
quelle
3
Hinzu kommt, dass temporäre Tabellen Indizes und Statistiken haben können, während Tabellenvariablen nur eine PK haben können. Sie haben einige Details hier .
Marian