Ich habe drei Tabellen:SQL Server-Abfrage mit Unterabfragen - Leistungsprobleme
Tabelle 1: | dbo.pc_a21a22 |
batchNbr Other columns...
-------- ----------------
12345
12346
12347
Tabelle 2: | dbo.outcome |
passageId record
---------- ---------
00003 200
00003 9
00004 7
Tabelle 3: | dbo.passage |
passageId passageTime batchNbr
---------- ------------- ---------
00001 2015.01.01 12345
00002 2016.01.01 12345
00003 2017.01.01 12345
00004 2018.01.01 12346
Was ich tun mag: für jedes batchNbr in Tabelle 1 erhält zuerst seine neueste passageTime und die entsprechende passageID aus Tabelle 3. Mit diesem passageID, erhalten Sie die entsprechenden Zeilen in Tabelle 2 und festzustellen, ob eine dieser Reihen enthält den Datensatz 200. Pro PassageId gibt es höchstens 2 Datensätze in Tabelle 2
Was ist der effizienteste Weg, dies zu tun?
Ich habe bereits eine Abfrage erstellt, die funktioniert, aber es ist schrecklich langsam und daher für Tabellen mit Millionen von Zeilen ungeeignet. Irgendwelche Vorschläge, wie man die Abfrage ändert oder es anders macht? Das Ändern der Tabellenstruktur ist keine Option, ich habe nur Leserechte für die Datenbank.
Meine aktuelle Lösung (langsam):
SELECT TOP 50000
a.batchNbr,
CAST (CASE WHEN 200 in (SELECT TOP 2 record FROM dbo.outcome where passageId in (
SELECT SubqueryResults.passageId From (SELECT Top 1 passageId FROM dbo.passage pass WHERE pass.batchNbr = a.batchNbr ORDER BY passageTime Desc) SubqueryResults
)
) then 1 else 0 end as bit) as KGT_IO_END
FROM dbo.pc_a21a22 a
Die gewünschte Ausgabe ist:
batchNbr 200present
--------- ----------
12345 1
12346 0
Es hat eine sein 'select *'. - nicht 'wählen * .a' ..... aber ansonsten: perfekte Antwort! –
Danke! Warum gibt es den drastischen Leistungsunterschied? – AlexGuevara
@marc_s - Danke, mein Herr! Verpasste diesen einen. –