Ich habe das folgende Problem in SQL Server 2005: Der Versuch, einige Zeilen in eine Tabellenvariable einzufügen, nimmt viel Zeit in Anspruch, verglichen mit derselben Einfügung mithilfe einer temporären Tabelle.
Dies ist der Code, der in die Tabellenvariable eingefügt werden soll
DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...
Dies ist der Code, der in die temporäre Tabelle eingefügt werden soll
CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data
Die temporäre Tabelle hat keine Schlüssel oder Indizes, der Auswahlbereich ist zwischen den beiden Abfragen identisch, und die Anzahl der von der Auswahl zurückgegebenen Ergebnisse beträgt ~ 10000 Zeilen. Die Zeit, die benötigt wird, um die Auswahl alleine auszuführen, beträgt ~ 10 Sekunden.
Die Ausführung der temporären Tabellenversion dauert bis zu 10 Sekunden. Ich musste die Tabellenvariablenversion nach 5 Minuten stoppen.
Ich muss eine Tabellenvariable verwenden, da die Abfrage Teil einer Tabellenwertfunktion ist, die keinen Zugriff auf temporäre Tabellen ermöglicht.
Ausführungsplan für die Tabellenvariablenversion
Ausführungsplan für die temporäre Tabellenversion
quelle
EXEC
für eine Funktion nicht verwenden können ... ich glaube, ich habe mich geirrtInvalid use of a side-effecting operator 'INSERT EXEC' within a function.
. DieOPENQUERY
Umgehung könnte jedoch funktionieren.Tabellenvariablen sind manchmal langsamer, da es keine Statistiken zu Tabellenvariablen gibt und der Optimierer daher immer nur einen Datensatz annimmt.
Ich kann jedoch nicht garantieren, dass dies hier der Fall ist. Sie müssen die Informationen zu den "geschätzten Zeilen" im Abfrageplan für die Tabellenvariable überprüfen.
quelle