DbLog / get mit vielen Daten

Begonnen von fstreffer, 27 Januar 2013, 11:49:00

Vorheriges Thema - Nächstes Thema

fstreffer

Hallo Zusammen,
ich habe bei mir eine FHEM Installation mit Homematic, einigen 1-Wire Sensoren und ich lese einige Werte aus meinem Viessmann Brenner aus.
Seit ca. einem Jahr schreibe ich die Daten in eine MySql Datenbank, so dass inzwischen einiges an Daten aufgelaufen ist.
Bisher war das mit den Grafiken aus der Datenbank und pgm2 nicht so einfach, aber das hat sich kürzlich geändert. Klasse!

Nun sind in meiner history Tabelle inzwischen ca. 3Mio. Einträge und der "SELECT" hat dann bei meinem Setup doch ca 60Sekunden gebraucht.
Dass wollte ich etwas schneller hin bekommen und habe eine Lösung gefunden.

Mit wem sollte ich die Änderungen besprechen, damit sie, wenn sie auch zu dem Gesamtpaket passen, in die Codebasis übernommen werden können.

Beste Grüße,
Friedrich  

Tobias

mit mir...

Für PostgreSQL habe ich "intelligente" Indices erstellt, bzw die Abfrage und Indices aufeinander abgestimmt.
IMHO sollten diese Indices auch auf MySQL übertragbar sein. Dann ist ein Tagesplot in 5-6sek erstellt. Eine Codeänderung ist IMHO nicht nötig, sollte nicht nötig sein.

Die Index DDL brauche ich dann um sie im Contrib im CREATE Script einzuchecken.
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

fstreffer

Hallo Tobias,
prima, dann habe ich wahrscheinlich die gleiche Lösung wie Du.

Das Select in der Methode DbLog_Get sieht jetzt bei mir wie folgt aus:
  my $stm= "SELECT
        $sqlspec{get_timestamp},
        DEVICE,
        READING,
        VALUE
                    $sqlspec{all}
      FROM history
      WHERE 1=1
        AND DEVICE = '".$readings[$i]->[0]."'
        AND READING = '".$readings[$i]->[1]."'
        AND TIMESTAMP > $sqlspec{from_timestamp}
        AND TIMESTAMP < $sqlspec{to_timestamp}
      ORDER BY TIMESTAMP";

und den Index habe ich definiert mit

create index Device_Idx on history (DEVICE, READING, TIMESTAMP);

Das müsste dann in das Script zum Anlegen der Datenbank.
Getestet habe ich es mit MySql. Ich habe in den Syntax-Beschreibungen von Postgresql, Oracle und Sqlite nach gesehen und ich denke es sollte dort auch funktionieren.

Beste Grüße,
Friedrich

Tobias

versuch bitte als erstes den unmodifizierten Code des DbLog Moduls zu benutzen und danach den Index daraufhin anzupassen.
DEVICE und READING wird auf einen String concatiniert. Hat den HIntergrund, mehr als ein Device/Reading mit derselben Abfrage zu erhalten.
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

fstreffer

Hallo Tobias,
Du hast wahrscheinlich einen sog. "function based index", wie sie in Oracle und wahrscheinlich auch in Postgresql existieren, verwendet. MySql kennt dieses Feature leider nicht. Insofern kommen wir wahrscheinlich nicht um eine Codeänderung herum, um die Abfragen auch im MySql zu beschleunigen.

Wenn das concat der Spalten für ein Feature von Dir wichtig ist, könnten wir die Funktionalität der "function based indices" mit einer extra Spalte nachbilden, die die Daten in zusammengesetzter From enthält. Über diese Spalte läuft dann der Index. Dafür müssten wir dann die INSERTS anpassen oder die einen entsprechenden Trigger in die Datenbank einfügen. Was mir an der Lösung nicht so recht gefällt ist die Duplizierung der Daten(menge).

Wie Siehst Du das?

Beste Grüße,
Friedrich


Tobias

doppelt abzulegen ist nicht so toll :(
Ev. muss die Abfrage um Device und Reading erweitert werden... ich muss mal drüber nachdenken...
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Tobias

Änderung im Modul ist eingecheckt, Index im contrib/dblog hinzugefügt
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter