![]() |
Datenbank: Firebitd • Version: 2.5 • Zugriff über: IBO
Join Abfrage schneller machen
Hallo gibt es eine Möglichkeit folgende SQL Abfrage schneller zu machen. Der Zugriff kann > 3 Sekunden je nach Menge der Datensätze betragen.
Delphi-Quellcode:
Ich muss eine Datenbank mit 34000 Datensätze updaten und das dauert mehr als 19 Stunden.
Select D.ICD,
PD.* from TBL_PATDIAGNOSE PD left join tbl_Diagnose D on D.DiagnoseNr = PD.DiagnoseNr where PD.PatientNr = :PatientNr order by PD.Datum Desc Hat jemand einen Tipp. |
AW: Join Abfrage schneller machen
Dein SQL hat aber nichts mit einem Update zu tun. Also frage ich mich, ob das Problem nicht eher im Update Statement liegt. Wie sieht dieses denn aus?
Betreffs deinem SELECT solltest du auf TBL_PATDIAGNOSE.DiagnoseNr und tbl_Diagnose.DiagnoseNr einen Index auf der DB haben (oder PK). Dann solltest du am besten wegen dem Order By, was du aber hoffentlich in deinem Update nicht so drin hast, auch einen Descending Index auf TBL_PATDIAGNOSE.Datum haben. Wie lange dauert denn dieses SELECT? Ich vermutet mal dein Update ruft diesen Join 34'000 mal auf. Teile uns doch bitte mit, wie dein Update genau aussieht. |
AW: Join Abfrage schneller machen
Ich habe in der Tabelle TBL_Patdiagnose ein neues Feld ICD eingefügt.
Nun will ich aus der Tabelle TBL_Diagnose den ICD Wert holen und in die Tabelle TBL_Patdiagnose einfügen. Meine Idee war Folgendermaßen: 1. Tabelle TBL_Patdiagnose in eine Schleife abarbeiten und jeweils updaten mit
Delphi-Quellcode:
ICD und Patdiagnose aus der join Abfrage.
Update Tbl_Patdiagnose PD set PD.ICD = :ICD wehre PD.PATDIAGNOSENR = :PATDIAGNOSENR
Indexe sind alle vorhanden. |
AW: Join Abfrage schneller machen
Wenn ich das nun richtig verstehe, dann soll in die Tabelle tblPatDiagnose für jeden Datensatz (eines oder aller Patienten) der ICD-Wert eingetragen werden, der in der Tabelle tbl_Diagnose zur entsprechenden Diagnose zu finden ist. Das entspricht zwar nicht der dritten Normalform aber da wird es sicherlich einen Grund für geben.
Bewerkstelligen läßt sich das durch ein SQL-Statement:
Code:
Das Statement macht das mit allen Datensätzen, also für alle Patienten.
UPDATE tblPATDIAGNOSE PD set PD.ICD = (select D.ICD from tblDiagnose D where D.DiagnoseNr = PD.DiagnoseNr)
|
AW: Join Abfrage schneller machen
.. wenn Du die Ausgabe der select - join Abfrage (ohne auf die Patienten ID zu filtern)
in eine Liste/Dictionary speicherst und diese dann für das update abfragst. Grüße Klaus |
AW: Join Abfrage schneller machen
Bei so Bulk-Operationen kann man vorher alle Indices dekativieren und nacher wieder aufbauen.
|
AW: Join Abfrage schneller machen
Danke Thomas das hats gebracht 45 min hats gedauert.
|
AW: Join Abfrage schneller machen
Hmm, 45 Minuten kommen mir da immer noch ziemlich lang vor.
Rufst Du dieses Update in einer Schleife immer wieder auf? Ich hätte eigentlich eine Laufzeit im Millisekunden- bis Sekunden-Bereich erwartet. |
AW: Join Abfrage schneller machen
Da du aus D nur die ICD brauchst, erzeuge eine Index auf:
D.DiagnoseNr, D.ICD |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz