Zum Inhalt springen

Query Optimierung


etherius

Empfohlene Beiträge

Hallo Leute,

wie ich gestern schon geschrieben hatte, hab ich leichte probleme mit einem query:


SELECT mp.id, mp.machine, mp.logtimestamp, mp.dyelotrefno, mp.alarmno, mp.alarmstate, mp.alarmaddstate, m.machinename, m.mgroupno, m.minvolume, m.maxvolume, m.minweight, m.maxweight, m.machinetype, m.importstate, m.importerror, mga.machgrp_mgroupno, mga.name, mga.shortname, mga.reaction, sm.Deutsch, sm.Englisch, sm.Französich, sm.Italienisch, sm.Spanisch, sm.Portugisisch, sm.Türkisch, sm.chinesisch, sm.Griechisch

FROM machineprotocol mp

JOIN machines m ON mp.machine = m.machineno

JOIN machgrpalarm mga ON m.mgroupno = mga.machgrp_mgroupno

JOIN MON1_stoermeldungen sm ON mga.TypeConfId = sm.TypeConfId

WHERE mp.Machine = 'MON1'

AND mp.DataType =1

AND mp.logtimestamp BETWEEN '2005-05-01' AND '2005-05-28'

und zwar gibt das query mir 2,8Mio Einträge zurück; ist nicht sinnvoll.

ich brauche prinzipiell für jeden der einträge in der tabelle machineprotocol die entsprechenden zugehörigen daten der tabellen machines, machgrpalarm und MON1_stoermeldungen; und NUR die Daten. Den Effekt hat mein Join allerdings leider nicht. Geht das überhaupt und ja wie?

Irgendwie bin ich was joins angeht doch nicht so weit wie ich immer dachte.

bin für jede hilfe dankbar

mfg

Eth

EDIT: mir fällt grad auf dass ich das vielleicht ins DB Forum hätte posten sollen ... @mod: verschieben :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich baue die "Joins" immer selbst in die WHERE Bedingung ein. Ob das allerding eines Optimierung ist weiß ich nicht. Das würde dann so aussehen


SELECT mp.id, mp.machine, mp.logtimestamp, mp.dyelotrefno, mp.alarmno, mp.alarmstate, mp.alarmaddstate, m.machinename, m.mgroupno, m.minvolume, m.maxvolume, m.minweight, m.maxweight, m.machinetype, m.importstate, m.importerror, mga.machgrp_mgroupno, mga.name, mga.shortname, mga.reaction, sm.Deutsch, sm.Englisch, sm.Französich, sm.Italienisch, sm.Spanisch, sm.Portugisisch, sm.Türkisch, sm.chinesisch, sm.Griechisch

FROM machineprotocol mp, machines m, machgrpalarm mga, MON1_stoermeldungen sm

WHERE m.machineno = mp.machine  

AND  m.mgroupno = mga.machgrp_mgroupno

AND mga.TypeConfId = sm.TypeConfId

AND mp.Machine = 'MON1'

AND mp.DataType =1

AND mp.logtimestamp BETWEEN '2005-05-01' AND '2005-05-28'

Link zu diesem Kommentar
Auf anderen Seiten teilen

Versuche mal:


SELECT mp.id, mp.machine, mp.logtimestamp, mp.dyelotrefno, mp.alarmno, mp.alarmstate, mp.alarmaddstate, m.machinename, m.mgroupno, m.minvolume, m.maxvolume, m.minweight, m.maxweight, m.machinetype, m.importstate, m.importerror, mga.machgrp_mgroupno, mga.name, mga.shortname, mga.reaction, sm.Deutsch, sm.Englisch, sm.Französich, sm.Italienisch, sm.Spanisch, sm.Portugisisch, sm.Türkisch, sm.chinesisch, sm.Griechisch

FROM machineprotocol mp

JOIN machines m ON mp.machine = m.machineno

JOIN machgrpalarm mga ON m.mgroupno = mga.machgrp_mgroupno

JOIN MON1_stoermeldungen sm ON mga.TypeConfId = sm.TypeConfId

WHERE mp.Machine = 'MON1'

AND mp.DataType =1

AND mp.logtimestamp BETWEEN '2005-05-01' AND '2005-05-28'

GROUP BY m.machineno, mga.machgrp_mgroupno, sm.TypeConfId

Gruß Jaraz

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bei den Datenmengen in den Tabellen schießt mir das regelmäßig den DB Server ab.

Funktioniert an sich ganz gut ... hat allerdings ne ausführungszeit von 67 sekunden ... ist für uns leider nicht akzeptabel ... also sollten wir vielleicht doch die daten separat auslesen und innerhalb unserer anwendung zusammenpacken ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

mysql kennt wie andere relationale datenbanken die EXPLAIN-syntax. eine ausgabe des optimiereres sowie allenfalls eine ausgabe der slow queries mit mysqldumpslow kann ganz hilfreich sein.

zusätzlich kann die von Jaraz erwähnte tabellenindizierung (wenn das tabellenmodell adaptiert werden kann/darf), tabellencaching (je nach art der DB, das können nicht alle), sowie ein generelles ausloten der möglichkeiten des servertunings schon mal einiges bringen.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

@pinhead: was meinst du mit einer DataSource? Das ganze läuft doch schon über eine ODBC DataSource...

Man kann auf einem Application Server eine DataSource eintragen. Und der stellt dann Connection Pool zur Verfügung. Ich habe festgestellt das diese Vorgehensweise sehr viel schneller ist als das Laden eines JDBC Treibers und dann das erzeugen einer Connection über den DriverManager

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ganze wird in unsere Anwendung symmedia SP/1 integriert.

Die Tabellen/Datenbankstruktur sowie die Serverkonfiguration wird vom Kunden festgelegt und ich habe keine Möglichkeit da irgendwas dran zu ändern.

Sieht wohl doch danach aus als ob ich die Daten manuell auslesen müsste ... und selbst zusammenbauen ... nur ob das schneller ist weiß ich auch nicht ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...