Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datenbankabfrage dauert 13 Sekunden (https://www.delphipraxis.net/154556-datenbankabfrage-dauert-13-sekunden.html)

youuu 15. Sep 2010 14:59

Datenbank: mysql • Version: 5.x • Zugriff über: devart

Datenbankabfrage dauert 13 Sekunden
 
Hallo,

ich beziehe ca. 4.000 Datensätze aus einer MySQL Tabelle, welche ca. 300.000 Datensätze aufweißt.
Allerdings dauert diese Abfrage 13 Sekunden.
Wie kann ich diese verbessern, ohne vorerst in der MySQL Tabelle selber rum zu fuchteln.

Hier die Abfrage:
Delphi-Quellcode:

  DSListe.TableName := '`links`,`kundendaten`';
  DSListe.FilterSQL := '(links.link_id = data.link_id) and (links.aufrufe <= 2) and (links.eintrag <> ''delete'') and ((links.date = date1) or (links.date = date2))';
DSListe = TUniTable.

mkinzler 15. Sep 2010 15:00

AW: Datenbankabfrage dauert 13 Sekunden
 
Nimm besser ein Query. Den so werden alle 300000DS an den Client übertragen und dort gefiltert

youuu 15. Sep 2010 15:09

AW: Datenbankabfrage dauert 13 Sekunden
 
Sollte eigentlich nicht, denn die Abfrage von UniTable sieht so aus

Delphi-Quellcode:
SELECT * FROM `links`,`kundendaten`
WHERE (links.link_id = data.link_id) and (links.aufrufe <= 2) and (links.eintrag <> ''delete'') and ((links.date = date1) or (links.date = date2))

Bernhard Geyer 15. Sep 2010 15:20

AW: Datenbankabfrage dauert 13 Sekunden
 
Wie groß ist die Datenbanktabelle?
Gibt es Indexe auf die Where-Felder?
Wie viel Speicher (RAM) darf sich der Server "genehmigen"
Virenscanner für die DB-Dateien deaktiviert?

Stevie 15. Sep 2010 15:28

AW: Datenbankabfrage dauert 13 Sekunden
 
Beinhalten die 13 Sekunden auch den Verbindungsaufbau zur Datenbank oder steht die schon vorher?
Nur bei der ersten Ausführung innerhalb einer Session oder jedesmal?

generic 15. Sep 2010 15:49

AW: Datenbankabfrage dauert 13 Sekunden
 
Code:
SELECT * FROM `links`,`kundendaten`
Das ist ein kartesisches Produkt.

DeddyH 15. Sep 2010 15:53

AW: Datenbankabfrage dauert 13 Sekunden
 
Ohne WHERE-Klausel wäre es das.
SQL-Code:
SELECT * FROM `links`,`kundendaten`
WHERE (links.link_id = data.link_id) ...
Allerdings gehe ich jetzt davon aus, dass es sich um einen C&P-Fehler handelt und data und kundendaten dasselbe sind.

rollstuhlfahrer 15. Sep 2010 15:55

AW: Datenbankabfrage dauert 13 Sekunden
 
Schneller gehts dann nur mit JOINS. Die brauchen auch wesentlich weniger Server-Ressourcen. Das sieht dann so ähnlich aus:
SQL-Code:
SELECT * FROM `links` INNER JOIN `kundendaten`.`link_id` ON `links`.`link_id` WHERE (links.aufrufe <= 2) and (links.eintrag <> ''delete'') and ((links.date = date1) or (links.date = date2))
Bei deinen Abfragen war übrigens ein Fehler drinnen, der oben beseitigt ist. Wenn du die Tabelle Kundendaten meinst, dann darfst du nicht später diese Tabelle mit data ansprechen. Der MySql-Server sollte diese dann nicht finden. Es würde mich wundern, wenn du mit diesem Query mehr als 1 Ergebnis bekommst (nämlich das Syntax-Fehler-Ergebnis).

Bernhard

mkinzler 15. Sep 2010 15:58

AW: Datenbankabfrage dauert 13 Sekunden
 
Zitat:

Schneller gehts dann nur mit JOINS.
Hat er doch, allerdings einen impliziten

Bernhard Geyer 15. Sep 2010 16:05

AW: Datenbankabfrage dauert 13 Sekunden
 
Zitat:

Zitat von generic (Beitrag 1049851)
Code:
SELECT * FROM `links`,`kundendaten`
Das ist ein kartesisches Produkt.

MySQL sollte nicht zusammenbrechen wenn der JOIN im Where ((links.link_id = data.link_id) ) kommt.
Es ist aber sinnvoll die SQL-Join-Syntax zu verwenden.

DeddyH 15. Sep 2010 16:12

AW: Datenbankabfrage dauert 13 Sekunden
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1049854)
SQL-Code:
SELECT * FROM `links` INNER JOIN `kundendaten`.`link_id` ON `links`.`link_id`

Du meinst sicher
SQL-Code:
SELECT * FROM `links` L INNER JOIN `kundendaten` D ON L.`link_id` = D.`link_id`

p80286 15. Sep 2010 16:26

AW: Datenbankabfrage dauert 13 Sekunden
 
Das wäre mir aber doch sehr neu, das ein JOIN schneller sein soll als ein where Tab1.id=tab2.id.

Wie groß ist denn ein Datensatz der hierdurch generiert wird?
Code:
SELECT * FROM `links`,`kundendaten`
Jedes Byte muß sich erst einmal über die Netzleitung quälen, und je mehr davon, desto langsamer!
Und was wird damit gemacht?
Die Anzeige von z.B. SQL+ ist so quälend langsam, daß jedes Ergebnis mit mehr als 1 Mb Größe zum Geduldsspiel wird. Da sind 13 Sekunden ein Klacks.

Gruß
K-H

youuu 15. Sep 2010 18:17

AW: Datenbankabfrage dauert 13 Sekunden
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1049837)
Wie groß ist die Datenbanktabelle?
Gibt es Indexe auf die Where-Felder?
Wie viel Speicher (RAM) darf sich der Server "genehmigen"
Virenscanner für die DB-Dateien deaktiviert?

Entschuldigung gerade rst vom Radtraining zurück.

Die Tabelle "links" besitzt ca. 200.000 Datensätze (steigend)
Die Tabell "Daten" (KundenDaten) besitzt ca. 60.000 Datensätze, ebenfalls steigend.
(kundendaten und data wr allerdings nur ein Abtipp Fehler ins Forum also keiner im Programm)

Indexe auf link_id beider Tabellen.


Kein Virenscanner für die DB und der Server besitzt 8GB Arbeitsspeicher, die zur vollen Verfügung stehen.

Delphi-Quellcode:
DSListe.Open;
verbraucht die vollen 13 Sekunden

youuu 15. Sep 2010 18:23

AW: Datenbankabfrage dauert 13 Sekunden
 
Zitat:

Zitat von p80286 (Beitrag 1049874)
Wie groß ist denn ein Datensatz der hierdurch generiert wird?
Code:
SELECT * FROM `links`,`kundendaten`


Enorm Zeit der Abfrage übersteigt die 2 Minuten, dann hab ich abgebrochen

DeddyH 15. Sep 2010 18:32

AW: Datenbankabfrage dauert 13 Sekunden
 
Wie ist es so (ich habe allerdings keine Ahnung, was date1 und date2 sind)?
SQL-Code:
SELECT
  * 
FROM
  `links` L
JOIN
  `kundendaten` D ON D.link_id = L.link_id
WHERE
  L.aufrufe <= 2
  AND L.eintrag <> 'delete'
  AND L.date IN(date1,date2)

youuu 15. Sep 2010 18:33

AW: Datenbankabfrage dauert 13 Sekunden
 
Ich habe jetzt die beiden anderen Felder auch indiziert in der mysql Tabelle und die Abfrage ist auf 3 Sek geschrumpft, normal oder immernoch zu hoch?

youuu 15. Sep 2010 18:36

AW: Datenbankabfrage dauert 13 Sekunden
 
Delphi-Quellcode:
 AND L.date IN(date1,date2)
nun brauch die Abfrage nur noch 1,24 Sekunden.
Super, Danke

DeddyH 15. Sep 2010 18:38

AW: Datenbankabfrage dauert 13 Sekunden
 
Brauchst Du wirklich alle Felder aus beiden Tabellen? Ich denke, eine Einschränkung auf die wirklich benötigten könnte auch noch etwas bringen.

youuu 15. Sep 2010 18:45

AW: Datenbankabfrage dauert 13 Sekunden
 
werde ich gleich versuchen

wicht 15. Sep 2010 18:53

AW: Datenbankabfrage dauert 13 Sekunden
 
Jau, ich hoffe mal ganz stark, dass das was noch etwas herausholt. Weil ein "Select *" heißt bei uns in der Firma einige Euros ins Abteilungs-Sparschwein...

mkinzler 15. Sep 2010 18:56

AW: Datenbankabfrage dauert 13 Sekunden
 
Schlimmer wäre aber ein fehlendes/falsches where oder on

wicht 15. Sep 2010 18:59

AW: Datenbankabfrage dauert 13 Sekunden
 
Das stimmt, aber hat ja andere (wohl noch schlimmere) Auswirkungen. Steht bei uns nicht auf der Dafür-muss-man-Strafe-zahlen-Liste, weil wir das für selbstverständlich ansehen :P

DeddyH 15. Sep 2010 19:00

AW: Datenbankabfrage dauert 13 Sekunden
 
Sicherlich, aber zig unbenötigte Felder (womöglich noch inkl. BLOBs) übers Netzwerk zu schaufeln ist auch keine gute Idee.

mkinzler 15. Sep 2010 19:02

AW: Datenbankabfrage dauert 13 Sekunden
 
Richtig mormalisierte Tabellen sollten eher klein sein.

alzaimar 15. Sep 2010 19:25

AW: Datenbankabfrage dauert 13 Sekunden
 
Wie viele Zeilen hat das Resultat?
Sind datensensitive Steuerelemente angeschlossen, also ein DBGrid, DBEdits?

Ich sehe zu, das ich so 100-200 Datensätze in weniger als 500ms bekomme (inklusive Anzeige).

youuu 15. Sep 2010 19:38

AW: Datenbankabfrage dauert 13 Sekunden
 
Also ich eralte nun 3600 Datensätze mit Anzeige in 1,7 Sekunden, da ich das alles in einem Thread laufen lasse, kann ich die 2 Sekunden mit einem Lade Screen überbrücken, Ich denke viel schneller wird es nicht mehr gehen.

fkerber 15. Sep 2010 20:02

AW: Datenbankabfrage dauert 13 Sekunden
 
Hi,

eine andere Frage wäre, ob du alle 3600 Einträge auf einmal brauchst.
Das hängt halt auch davon ab, was du mit ihnen tun willst...


Liebe Grüße,
Frederic


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 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