Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi performance problem (https://www.delphipraxis.net/116584-performance-problem.html)

Delphi-Phil 2. Jul 2008 15:44

Datenbank: mysql • Zugriff über: ado

performance problem
 
Hallo Delphi-Freunde,

ich habe folgenden SQL Code und die Performance ist einfach gruselig...

Die Abfrage dauert geschlagene 2 Minuten!!! Wie kann sowas sein??

SQL-Code:
SELECT vorname, nachname, fach
FROM schueler s
INNER JOIN schueler_faecher sf
  ON s.id = sf.id_schueler
INNER JOIN faecher f
  ON sf.id_fach = f.id
INNER JOIN schueler_klassen sk
  ON s.id = sk.idschueler
WHERE idklasse = :KID
  AND NOT EXISTS (SELECT *
                  FROM zeugnis
                  WHERE id_schueler = s.id
                    AND id_fach = sf.id_fach)
Ganz liebe Grüße von der sonnigen Ostsee, ich liege hier mit Laptop und UMTS Karte am Strand (O2 mach es für 25 Euro Mtl. möglich)

Bernhard Geyer 2. Jul 2008 15:48

Re: performance problem
 
Wie groß ist die Datenbank (Anzahl der Einträge in den entsprechenden Tabellen)?
Wieviel Speicher wird dem SErver zugestanden (die Standardinstallation von MySQL ist ziemlich sparsam, wenn nicht sozusagen knausrig)?
Sind auf allen gejointen Felder Indize vorhanden?

DeddyH 2. Jul 2008 15:53

Re: performance problem
 
Und so (ohne Gewähr)?
SQL-Code:
SELECT vorname, nachname, fach
FROM schueler s
INNER JOIN schueler_faecher sf
  ON s.id = sf.id_schueler
INNER JOIN faecher f
  ON sf.id_fach = f.id
INNER JOIN schueler_klassen sk
  ON s.id = sk.idschueler
LEFT JOIN zeugnis z
  ON z.id_schueler = s.id AND z.id_fach = sf.id_fach
WHERE idklasse = :KID
AND z.id_schueler IS NULL

alzaimar 2. Jul 2008 15:56

Re: performance problem
 
Zitat:

Zitat von Delphi-Phil
ich habe folgenden SQL Code und die Performance ist einfach gruselig...
Die Abfrage dauert geschlagene 2 Minuten!!! Wie kann sowas sein??

Schlechte Server, schlechtes DB-Design, keine/falsche Indexe. Ganz selten fuhrwerkt irgendein blöder Prozess und frisst die CPU auf. Aber Bernhard hat schon die richtigen Fragen gestellt.

Grundsätzlich scheint jedoch das Gerücht verbereitet zu sein, ein RDBMS (insbesondere MySQL) sei eine Zauberschachtel und 'unheimlich schnell'. Das einzige, was unheimlich schnell ist, ist die Verbreitung so eines Schmarrns :zwinker:. Ich hab sogar schon gehört, das so ein RDMBS sich seine Index mal eben optimal zusammenbaut... Eine RDBMS ist nur so schnell, wie das Server- und Datenbankdesign es zulässt. Und das ist reine Handarbeit.

Wichtig ist
1. Gute Hardware (kein Turboteil, aber 1-4GB RAM sollten es schon sein), gute HD usw.
2. Gutes DB-Design. Eine Mischung aus 2. und 3.NF machts.
3. Indexe nur an den notwendigen Stellen, allerdings nicht bei kleinen Tabellen (10-50 Records)

Dann gibt es noch ca. 175.819,3 Tipps und Tricks, wo man noch rumschrauben kann, aber wenn Du die ersten drei Punkte beachtest, kommst du schon sehr weit.

Delphi-Phil 2. Jul 2008 16:04

Re: performance problem
 
danke erstmal für die guten tips, ich werde alles prüfen und dann morgen bescheid geben...

mquadrat 3. Jul 2008 07:13

Re: performance problem
 
Ich würde das auch so probieren wie DeddyH das vorgeschlagen hat. Diese Unter-Selects sind ein ziemlicher Performance-Killer.

alzaimar 3. Jul 2008 08:34

Re: performance problem
 
Zitat:

Zitat von mquadrat
Diese Unter-Selects sind ein ziemlicher Performance-Killer.

Wie kommst du darauf? Normalerweise erzeugt ein guter SELECT-Compiler für Subselects den gleichen Suchbaum wie für (Left Joins). Jedenfalls sollte er das tun. :gruebel: (MSSQL machts) Aber ob MySQL da mitmacht, weiss ich gerade nicht...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz