/ / Wiederverwenden von ausgewählten Unterabfragen / Ergebnissen - SQL, SQL-Server, Abfrageoptimierung, Union, Rdbms

Zurücksetzen der ausgewählten Unterabfrage / result - sql, sql-server, Abfrageoptimierung, union, rdbms

Ich versuche, die Geschwindigkeit einer Abfrage zu optimieren, die einen redundanten Abfrageblock verwendet. Ich versuche, einen zeilenweisen Join in SQL Server 2008 mit der folgenden Abfrage durchzuführen.

Select * from
(<complex subquery>) cq
join table1 t1 on (cq.id=t1.id)
union
Select * from
<complex subquery> cq
join table2 t2 on (cq.id=t2.id)

Das <complex subquery> ist für beide Union-Unterabfrageteile genau gleich, mit der Ausnahme, dass mehrere verschiedene Tabellen verknüpft werden müssen, um dieselben spaltenspezifischen Daten zu erhalten.

Gibt es eine Möglichkeit, die Abfrage umzuschreiben, um sie schneller zu machen, ohne eine temporäre Tabelle zum Zwischenspeichern von Ergebnissen zu verwenden?

Antworten:

3 für die Antwort № 1

Verwenden Sie eine temporäre Tabelle und prüfen Sie, ob dies die Ausführungsstatistik verbessert.

Unter bestimmten Umständen fügt das Abfrageoptimierungsprogramm dem Plan automatisch einen Spool hinzu, der Unterabfragen zwischenspeichert. Dies ist jedoch im Grunde genommen nur eine temporäre Tabelle.

Haben Sie Ihren aktuellen Plan überprüft, um sicherzustellen, dass die Abfrage tatsächlich mehrmals ausgewertet wird?


1 für die Antwort № 2

Ohne ein konkretes Beispiel ist es schwierig zu helfen, aber versuchen Sie es mit einer WITH-Anweisung, wie zum Beispiel:

WITH csq(x,y,z) AS (
<complex subquery>
)
Select * from
csq
join table1 t1 on (cq.id=t1.id)
union
Select * from
csq
join table2 t2 on (cq.id=t2.id)

es beschleunigt manchmal die Dinge ohne Ende


0 für die Antwort № 3

Ermöglicht es Ihnen die Art Ihrer Abfrage, diese zu invertieren? Anstelle von "(join, join) union", "(union) join"? Mögen:

Select * from
(<complex subquery>) cq
join (
Select * from table1 t1
union
Select * from table2 t2
) ts
on cq.id=ts.id

Ich bin mir nicht sicher, ob eine doppelte Bewertung Ihrer komplexen Abfrage tatsächlich das ist, was falsch ist. Laut Ihrer Frage wäre dies jedoch eine Form der Abfrage, die SQL dazu anregen würde, nur zu evaluieren <complex query> Einmal.