/ / Wie löst man langsam laufende TSQL-Abfrage - SQL, SQL-Server, TSQL

Wie löst man langsam laufende TSQL-Abfrage - SQL, SQL-Server, TSQL

Ich habe ein Problem mit einer langsam laufenden Abfrage. Ich habe die Abfrage mit dem SQL Server Profiler analysiert, aber ich kann nicht scheinen, eine gute Lösung zu finden. Ich habe herausgefunden, warum es langsam läuft. Wenn ich das vollständige Dataset anfrage, gibt es mir 150 Zeilen in 10s zurück, wenn ich die Summen und Berechnungen addiere, gibt es mir 18 Zeilen zurück, aber es dauert 8 Minuten.

Im SQL Server Profiler habe ich herausgefunden, dass dievollständiger Datensatz macht ungefähr 1 000 000 Lesevorgänge und die Summenabfrage ungefähr 82 000 000. Aber ich weiß nicht, wie oder warum er viele Datensätze erhält. Weil der vollständige Datensatz der Unterauswahl aus der Summenabfrage ist.

Die folgende Abfrage ist ein Beispiel, nicht die echte Abfrage (echte Abfrage hat auch Union alle "s in der Unterabfrage, aber die Summe Abfrage ist im Grunde das Gleiche)

SELECT Sum(x) * 0.1,
Sum(y),
a
FROM   (SELECT x,
y
FROM   tx
INNER JOIN ty ON tx.a = ty.a
WHERE  x = 1 --this returns 150 rows in 10s
) sub
GROUP  BY a -- sum returns 18row 8min

Kann mir jemand mit ein paar weiteren Tests helfen oder eine Lösung testen? First Piece Ausführungsplan Zweites Stück Drittes Stück

Antworten:

0 für die Antwort № 1

Versuchen Sie, die Abfrage in zwei Schritten unter Verwendung einer temporären Tabelle aufzulösen, um die Unterabfrage zu entfernen:

-- populate temp table
SELECT x, y, a
INTO #TEMP
FROM   tx INNER JOIN ty ON tx.a = ty.a
WHERE  x = 1

-- query the temp table
SELECT Sum(x) * 0.1,
Sum(y),
a
FROM #TEMP
GROUP BY a

0 für die Antwort № 2

Ich würde vorschlagen, die Aggregationen zweimal durchzuführen. In Ihrem Beispiel sieht das etwas unsensibel aus, aber die Struktur ist:

SELECT sum(x), sum(y)
Sum(y),
a
FROM   (SELECT a, sum(x) * 0.1 as x, sum(y) as y
FROM tx INNER JOIN
ty
ON tx.a = ty.a
WHERE  x = 1 --this returns 150 rows in 10s
GROUP BY a
) sub
GROUP  BY a ;

SQL sollte sich besser mit den einzelnen Tabellen aggregieren, die Ergebnisse kombinieren und erneut aggregieren, als es bei der Aggregation auf einem SQL-Server tun würde union der einzelnen Tabellen. Auch wenn Sie verwenden union Anstatt von union all, das wird die Leistung beeinflussen.