Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Join Abfrage schneller machen (https://www.delphipraxis.net/211890-join-abfrage-schneller-machen.html)

Walter Landwehr 17. Nov 2022 14:01

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:
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
Ich muss eine Datenbank mit 34000 Datensätze updaten und das dauert mehr als 19 Stunden.

Hat jemand einen Tipp.

Rolf Frei 17. Nov 2022 14:20

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.

Walter Landwehr 17. Nov 2022 14:44

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:
Update Tbl_Patdiagnose PD set PD.ICD = :ICD wehre PD.PATDIAGNOSENR = :PATDIAGNOSENR
ICD und Patdiagnose aus der join Abfrage.

Indexe sind alle vorhanden.

TBx 17. Nov 2022 15:09

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:
UPDATE tblPATDIAGNOSE PD set PD.ICD = (select D.ICD from tblDiagnose D where D.DiagnoseNr = PD.DiagnoseNr)
Das Statement macht das mit allen Datensätzen, also für alle Patienten.

Klaus01 17. Nov 2022 15:10

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

TigerLilly 17. Nov 2022 15:31

AW: Join Abfrage schneller machen
 
Bei so Bulk-Operationen kann man vorher alle Indices dekativieren und nacher wieder aufbauen.

Walter Landwehr 17. Nov 2022 16:12

AW: Join Abfrage schneller machen
 
Danke Thomas das hats gebracht 45 min hats gedauert.

TBx 17. Nov 2022 17:29

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.

generic 18. Nov 2022 21:40

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