AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Doppel-Select-Anweisung zu langsam
Thema durchsuchen
Ansicht
Themen-Optionen

Doppel-Select-Anweisung zu langsam

Ein Thema von Ykcim · begonnen am 4. Feb 2013 · letzter Beitrag vom 7. Feb 2013
Antwort Antwort
Seite 1 von 6  1 23     Letzte »    
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#1

Doppel-Select-Anweisung zu langsam

  Alt 4. Feb 2013, 16:26
Datenbank: MySQL • Version: 5 • Zugriff über: UniDac
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 '20120101and '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
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Doppel-Select-Anweisung zu langsam

  Alt 4. Feb 2013, 16:35
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Doppel-Select-Anweisung zu langsam

  Alt 4. Feb 2013, 16:49
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
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Doppel-Select-Anweisung zu langsam

  Alt 4. Feb 2013, 16:51
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 '20120101AND '20121231'
Ggf. noch Indizes auf SpalteA und SpalteDatum setzen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Doppel-Select-Anweisung zu langsam

  Alt 4. Feb 2013, 17:03
Was mache ich hier nur???

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

Gruß
Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Doppel-Select-Anweisung zu langsam

  Alt 4. Feb 2013, 17:05
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: Doppel-Select-Anweisung zu langsam

  Alt 4. Feb 2013, 17:09
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Doppel-Select-Anweisung zu langsam

  Alt 4. Feb 2013, 17:14
Jetzt hat sich der MySQL-Server vollendst abgeschossen...
Ich versuche es später.

Vielen Dank erst mal

Gruß und schönen Abend
Patrick
Patrick
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: Doppel-Select-Anweisung zu langsam

  Alt 4. Feb 2013, 18:02
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Doppel-Select-Anweisung zu langsam

  Alt 5. Feb 2013, 08:19
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)

Geändert von Codehunter ( 5. Feb 2013 um 08:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 6  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 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