Gibt es Vorteile bei der Verwendung temporärer Tabellen gegenüber abgeleiteten Tabellen in SQL Server?

8

Ich habe gelesen, dass die abgeleiteten Tabellen eine bessere Leistung haben als temporäre Tabellen, aber trotzdem bevorzugen viele SQL Server-Entwickler die zweiten. Warum? Ich muss Abfragen mit großen Datenmengen (Millionen Datensätze) durchführen und möchte sicher sein, dass ich die beste Wahl verwende.

CREATE TABLE A(
    id BIGINT IDENTITY(1,1) NOT NULL,
    field1 INT NOT NULL,
    field2 VARCHAR(50) NULL,
);

CREATE TABLE B(
    id INT IDENTITY(1,1) NOT NULL,
    field1 VARCHAR(10) NULL,
    field2 INT NULL
);

INSERT INTO A 
    (field1,field2)
VALUES 
    (1,'a'),(2,'b'),(3,'c'),(2,'d'),(5,'e'),
    (6,'f'),(7,'g'),(8,'h'),(9,'i'),(2,'j');

INSERT INTO B 
    (field1,field2)
VALUES 
    ('a',1),('b',2),('c',3),('d',4),('e',5),
    ('f',6),('g',7),('h',8),('i',9),('j',2),('k',3);

DECLARE @begin INT=0,@end INT=200;

Abgeleitete Tabellen

/*derived tables*/
SELECT 
    C.id,C.field1,C.field2,C.field3 
FROM
(
    SELECT
        A.id,A.field1,A.field2,B.field2 AS field3, 
        ROW_NUMBER() OVER (ORDER BY A.id) AS iRow
    FROM 
        A INNER JOIN B ON A.field1=B.id
) C
WHERE iRow BETWEEN @begin AND @end;

Temporäre Tische

/*temporary tables*/
CREATE TABLE #C (
    iRow INT IDENTITY(1,1),
    id bigint,
    field1 INT,
    field2 VARCHAR(50),
    field3 INT );

INSERT INTO #C 
    (id,field1,field2,field3)
SELECT TOP 1000 
    A.id,A.field1,A.field2,B.field2 
FROM  
    A INNER JOIN B ON A.field1=B.id
ORDER BY 
    A.id;

SELECT id,field1,field2,field3 
FROM #C 
WHERE iRow BETWEEN @begin AND @end;

DROP TABLE #C;
norgematos
quelle
1
Du hast ein SELECT TOP 1000ohne ORDER BY, das ist nicht gut. Ich denke, Sie müssen hinzufügen, ORDER BY A.id;damit die beiden Möglichkeiten gleichwertig sind.
Ypercubeᵀᴹ
Es ist nur eine Probe. Ziel ist es, das Hauptthema meiner Frage aufzuzeigen.
Norgematos

Antworten:

6

@ user16484 hat Sie bereits darauf hingewiesen, welche eine bessere Leistung haben: Abgeleitete Tabellen oder temporäre Tabellen im Kommentar.

Siehe auch Temp Table 'vs' Table Variable 'vs' CTE. Dies umfasst auch abgeleitete Tabellen.

Eine kurze Zusammenfassung: # temp-Tabellen können indiziert werden, können EINZIGARTIGE Indizes / Einschränkungen haben, können mehr als einmal in derselben Abfrage referenziert werden, können von mehr als einer Abfrage referenziert werden (FROM oder JOIN). Abgeleitete Tabellen können einmal in einer Abfrage referenziert werden (FROM oder JOIN).

In Bezug auf die Leistung ziehen Sie Profiler für SQL: BatchCompleted und RPC: Completed heraus. Sehen Sie sich die Spalten Lesen, Schreiben, CPU und Dauer an und sehen Sie, was einige Durchläufe abgeleiteter Tabellen im Vergleich zu # temp-Tabellen im Vergleich zu indizierten # temp-Tabellen bewirken jede bestimmte Abfrage.

Im Allgemeinen - wenn Sie es mehr als einmal verwenden, gewinnt die Tabelle #temp. Wenn Sie sich vielen Tabellen anschließen, gewinnt wahrscheinlich die # temp-Tabelle. Wenn Sie nur wenigen Tabellen beitreten, hat die abgeleitete Tabelle eine angemessene Gewinnchance. Benchmarking!

Anti-Schwachkennwörter
quelle
6

Im Allgemeinen hängt dies von Ihren speziellen Abfragen und der Größe der temporären Ergebnisse ab.

Für das angegebene Szenario, das Paging ist, sind temporäre Tabellen völlig unnötig. Warum sollten Sie 1000 Zeilen in einer temporären Tabelle speichern, um dann die ersten 200 zurückzugeben? Die Verwendung einer 'abgeleiteten' Tabelle oder eines CTE in diesem Szenario ist viel effizienter, da die vollständige Ergebnismenge nirgendwo gespeichert oder in den meisten Fällen sogar erstellt werden muss. Wenn beispielsweise die erste Seite mit 200 Zeilen angefordert wird, müssen nur die ersten 200 Zeilen aus den Basistabellen abgerufen werden (vorausgesetzt, vorhandene Indizes können die in der Abfrage angeforderte Sortierreihenfolge unterstützen).

Vlad G.
quelle
1
+1, obwohl ich hinzufügen möchte, dass das Abfrageoptimierungsprogramm mithilfe abgeleiteter Tabellen auch beide Abfragen gleichzeitig verarbeiten kann. Dies kann gut oder manchmal schlecht sein, wiederum "abhängig von der jeweiligen Abfrage". Deshalb ist es immer gut, beide zu testen (an realen Daten, nicht an Beispieldaten), anstatt zu raten :-).
Solomon Rutzky