Veröffentlicht 29. September 200618 j 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
29. September 200618 j 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'
29. September 200618 j 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
29. September 200618 j 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 ...
29. September 200618 j Bei den Datenmengen in den Tabellen schießt mir das regelmäßig den DB Server ab. von was fuer einer DB reden wir eigentlich ?
29. September 200618 j wir reden von standard-sql; das query soll in der fertigen anwendung über ne odbc schnittstelle mit einer beliebigen datenbank funktionieren. Momentan teste ich allerdings auf mysql 4.1
29. September 200618 j sitzt jeweils ein passender index auf: mp.machine m.machineno m.mgroupno mga.machgrp_mgroupno mga.TypeConfId sm.TypeConfId mp.DataType mp.logtimestamp ???
29. September 200618 j Leider kann ich die Datenstruktur nicht verändern, die ist vom Kunden so vorgegeben.
29. September 200618 j Funktioniert an sich ganz gut ... hat allerdings ne ausführungszeit von 67 sekunden ... ... Soll die Anwendung später auf einem Application Server laufen ? Dann würde ich die Verwendung einer DataSource empfehlen, die beschleunigt das ganze ungemein
29. September 200618 j Momentan teste ich allerdings auf mysql 4.1 wenn Du mit einer Datenbank arbeiten wuerdest, dann wuerde sich ein ausfuehrungsplan mal lohnen. kann das eine mysql?
29. September 200618 j ich hab absolut keine ahnung. @pinhead: was meinst du mit einer DataSource? Das ganze läuft doch schon über eine ODBC DataSource...
29. September 200618 j 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
29. September 200618 j @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
29. September 200618 j 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 ...
29. September 200618 j Hab da erstmal überall LEFT JOINs raus gemacht. Funktioniert zumindest schonmal alles ist aber halt noch recht lahm mit 110-120sek ...
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.