Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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'

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

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 ...

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

von was fuer einer DB reden wir eigentlich ?

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

sitzt jeweils ein passender index auf:

mp.machine

m.machineno

m.mgroupno

mga.machgrp_mgroupno

mga.TypeConfId

sm.TypeConfId

mp.DataType

mp.logtimestamp

???

Leider kann ich die Datenstruktur nicht verändern, die ist vom Kunden so vorgegeben.

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

häää?

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?

ich hab absolut keine ahnung.

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

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

@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

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 ...

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.