etherius Geschrieben 29. September 2006 Teilen Geschrieben 29. September 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Pinhead Geschrieben 29. September 2006 Teilen Geschrieben 29. September 2006 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' Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 29. September 2006 Teilen Geschrieben 29. September 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etherius Geschrieben 29. September 2006 Autor Teilen Geschrieben 29. September 2006 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 ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zirri Geschrieben 29. September 2006 Teilen Geschrieben 29. September 2006 Bei den Datenmengen in den Tabellen schießt mir das regelmäßig den DB Server ab. von was fuer einer DB reden wir eigentlich ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etherius Geschrieben 29. September 2006 Autor Teilen Geschrieben 29. September 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 29. September 2006 Teilen Geschrieben 29. September 2006 sitzt jeweils ein passender index auf: mp.machine m.machineno m.mgroupno mga.machgrp_mgroupno mga.TypeConfId sm.TypeConfId mp.DataType mp.logtimestamp ??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etherius Geschrieben 29. September 2006 Autor Teilen Geschrieben 29. September 2006 Leider kann ich die Datenstruktur nicht verändern, die ist vom Kunden so vorgegeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Pinhead Geschrieben 29. September 2006 Teilen Geschrieben 29. September 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etherius Geschrieben 29. September 2006 Autor Teilen Geschrieben 29. September 2006 häää? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zirri Geschrieben 29. September 2006 Teilen Geschrieben 29. September 2006 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etherius Geschrieben 29. September 2006 Autor Teilen Geschrieben 29. September 2006 ich hab absolut keine ahnung. @pinhead: was meinst du mit einer DataSource? Das ganze läuft doch schon über eine ODBC DataSource... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 29. September 2006 Teilen Geschrieben 29. September 2006 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Pinhead Geschrieben 29. September 2006 Teilen Geschrieben 29. September 2006 @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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etherius Geschrieben 29. September 2006 Autor Teilen Geschrieben 29. September 2006 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 ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etherius Geschrieben 29. September 2006 Autor Teilen Geschrieben 29. September 2006 Hab da erstmal überall LEFT JOINs raus gemacht. Funktioniert zumindest schonmal alles ist aber halt noch recht lahm mit 110-120sek ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.