Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#1

Otimierung SQL Abfrage oder Logik

  Alt 11. Dez 2015, 18:13
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Hallöle...

Ich bräuchte mal ein paar Tipps zur Optimierung. Außerdem redet ja sonst keiner mit mir...

Gegeben:
* Datentabelle mit 3,5 Mio Datensätzen
* In der Datentabelle sind nur die Werte gespeichert wenn sie sich ändern. Bsp. Value 5,6,7,5,4 - Value 5,5,6,6,6,6,7,7,5,5,4 gibts nicht.
* Gewählter Zeitraum für die SQL Abfrage zum Beispiel letzte 24 Stunden.
* Es gibt 2 Modi: Anzeige der Daten im kompletten Zeitraum (Bild1) bzw. nur die vorhandenen Daten (Bild 2)
* Es kann vorkommen das die vorhandenen Daten nicht den gesamten Zeitraum abdecken. Das passiert z.B. wenn das Gerät ausgeschaltet war und keine Daten aufgezeichnet hat. Dazu generiere ich mir in der Komplettansicht für jede Serie einen Anfangs und Endwert der aus dem vorhergehenden vorhandenen Datensatz besteht. Darin besteht der Flaschenhals.

* Ein Thread holt die Daten für jede Serie nacheinander ab und füllt damit für jede Serie getrennte Liste. (incl. evt. generiertem Anfang und Ende)
In diesem Beispiel würde die Abfrage auf den vorhergehenden Wert 12 Mal durchgeführt werden. Ob "Kerndaten" vorhanden sind oder nicht. Jede dieser Abfragen benötigt im Durchschnitt 70ms. Da bedeutet das incl. Transport (100ms rechnet sich besser ) 1,2 Sekunden nur für die "Berechnung" flöten gehen. Dass gefällt mir nicht wirklich...

Soll:
* Ideen für Optimierung ohne Komplettumbau... Letztendlich komme ich wahrscheinlich nicht um eine SQL Abfrage herum weil ich mir die Ergebnisse nicht anderweitig "Merken" kann. Über eine SP, die mir die Values listet, denke ich schon nach. Die muß aber die Werte auch aus der DB generieren...

SQL:
Beide Abfragen bringen die korrekten Ergebnisse. Der komplette Join (wäre schön) liegt nur 10ms drüber.

komplett mit Join
Code:
select first (1) D.F_PARAMETER_ID, D.F_TIMESTAMP_UNIX, D.F_POWER_STATE, D.F_VALUE, T.F_TYPE_ID from T_RECORD_DATA D
join T_DEVICE_PARAMETERS P on P.ID = D.F_PARAMETER_ID
join T_MEASURE_TYPES T on T.ID = P.F_MEASURE_TYPE_ID
where D.F_PARAMETER_ID = 1060 and D.F_TIMESTAMP_UNIX < 1449737313
order by F_TIMESTAMP_UNIX desc
vereinfacht
Code:
select first (1) F_TIMESTAMP_UNIX, F_VALUE from T_RECORD_DATA D
where F_PARAMETER_ID = 1060 and F_TIMESTAMP_UNIX < 1449737313
order by F_TIMESTAMP_UNIX desc
Miniaturansicht angehängter Grafiken
bild1.png   bild2.png  

Geändert von haentschman (11. Dez 2015 um 18:22 Uhr)
  Mit Zitat antworten Zitat