Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Doppel-Select-Anweisung zu langsam (https://www.delphipraxis.net/173041-doppel-select-anweisung-zu-langsam.html)

Ykcim 4. Feb 2013 16:26

Datenbank: MySQL • Version: 5 • Zugriff über: UniDac

Doppel-Select-Anweisung zu langsam
 
Hallo Zusammen,

ich habe eine Tabelle mit ca 500.000 Datensätzen. Dort mache ich so eine Abfrage:

Delphi-Quellcode:
Select * from Tabelle1 where SpalteA in (
Select SpalteA from Tabelle1 where SpalteDatum between '20120101' and '20121231')
Ich mache die Abfrage deshalb so, weil es Aufträge gibt, bei denen nicht alle in 2012 abgeschlossen wurden, sondern nur die letzten. Von diesen Aufträgen möchte ich aber alle Arbeitsgänge mit rausbekommen.

Leider schmiert mit der MySQL-Server bei dieser Abfrage ab. Wie würdet Ihr das lösen?

Vielen Dank
Patrick

p80286 4. Feb 2013 16:35

AW: Doppel-Select-Anweisung zu langsam
 
Jetzt krieg ich wieder Haue weil ich keine Ansi-Joins verwende
Code:
select * 
from Tabelle1
    ,(select spalteA from Tabelle1 where Bedingung) BedTable
where Tabelle1.Spaltea=BedTable.Spaltea
Gruß
K-H

Ykcim 4. Feb 2013 16:49

AW: Doppel-Select-Anweisung zu langsam
 
Hallo,

leider bringt auch diese Anweisung nach mehreren Minuten noch kein Ergebnis... Ist das so kompliziert für den SQL-Server oder warum funktioniert das nicht in einer halbwegs vernümftigen Zeit???

Gruß
Patrick

DeddyH 4. Feb 2013 16:51

AW: Doppel-Select-Anweisung zu langsam
 
So müsste es auch gehen, wenn ich keinen Denkfehler mache:
SQL-Code:
SELECT
  A.*
FROM
  Tabelle1 A
JOIN
  Tabelle1 B ON B.SpalteA = A.SpalteA
WHERE
  B.SpalteDatum BETWEEN '20120101' AND '20121231'
Ggf. noch Indizes auf SpalteA und SpalteDatum setzen.

Ykcim 4. Feb 2013 17:03

AW: Doppel-Select-Anweisung zu langsam
 
Was mache ich hier nur???

Auch diese Lösung bringt nach mehreren Minuten kein Ergebnis...

Gruß
Patrick

DeddyH 4. Feb 2013 17:05

AW: Doppel-Select-Anweisung zu langsam
 
Wieviele Datensätze sind denn das insgesamt? Und stimmt das Datumsformat? Ich bin gerade nicht mehr sicher, wie das unter MySQL auszusehen hat, hast Du es mal mit SQL-Parametern probiert? Sind Indizes vorhanden?

jobo 4. Feb 2013 17:09

AW: Doppel-Select-Anweisung zu langsam
 
Ich behaupte mal, das SQL Statement ist 2.rangig. Schließlich ist MySQL nicht mehr Version 2.0 doer so..
Die Indizierung ist entscheidend.

Und was bedeutet "abschmieren", so ist das halt by full table scan ohne indizierung (Vermutung).
Ok, vielleicht ist der mySQL optimizer tatsächlich so gestrickt. Notfalls mit dem Range select eine Temp Table bauen und die dann weiterverwenden, macht nur 2 Full Table scans.

Ykcim 4. Feb 2013 17:14

AW: Doppel-Select-Anweisung zu langsam
 
Jetzt hat sich der MySQL-Server vollendst abgeschossen...
Ich versuche es später.

Vielen Dank erst mal

Gruß und schönen Abend
Patrick

jobo 4. Feb 2013 18:02

AW: Doppel-Select-Anweisung zu langsam
 
einfach mal die Statement Varianten mit

Code:
explain [mysqlstatement]
oder
Code:
explain extended [mysqlstatement]
aufrufen.

Ach nochwas, falls deine Spalte A (das Hauptjoinkriterium also?) offenbar nicht eindeutig ist, sondern nur sowas wie ein Gruppenschlüssel, solltest Du je nach Statement variante aus den vorschlägen noch ein 'distinct' oder 'group by' spendieren, sonst explodiert das Volumen tatsächlich, bei 500T Sätzen sicher unangenehm.
Möglicherweise fallen Dir ja auch noch andere Kriterien ein, die das ganze etwas eindampfen.

Codehunter 5. Feb 2013 08:19

AW: Doppel-Select-Anweisung zu langsam
 
Ich würde mir mal den Server genauer anschauen:
  1. Wie groß ist die Datenmenge, die der Server durch die Anfrage zu verarbeiten hat?
  2. Wie viele Datensätze sind zu verarbeiten?
  3. Sind für die in den WHERE-Klauseln aufgeführten Felder Indizes gesetzt?
  4. Ist dem Server ausreichend RAM zugewiesen? (my.cnf)
  5. Wie viel Holz hat die Servermaschine vor der Hütte?
  6. Passt die Client-Lib zum Server? (libmysql.dll-Version bzw. UniDAC-Einstellungen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 Uhr.
Seite 1 von 6  1 23     Letzte »    

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