DBLog - Historische Werte ausdünnen

Begonnen von C0mmanda, 14 September 2015, 18:38:21

Vorheriges Thema - Nächstes Thema

stromer-12

Zitat von: rapster am 22 September 2015, 00:44:59
Du kannst es ja mal direkt mit
SELECT count(*) FROM history WHERE TIMESTAMP < DATE_SUB(CURDATE(),INTERVAL 560 DAY) ORDER BY TIMESTAMP ASC
ausprobieren, ob du hier einen genauso hohen delay hast.
Damit ist der Delay ebenfalls so hoch.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

rapster

Bin zwar kein MySQL Profi, denke allerdings dein Index wird bei dieser SQL abfrage nie verwendet, da TIMESTAMP in der sequence nur an dritter Stelle steht (und wenn er verwendet würde wäre er ziemlich langsam).

Der empfohlene reduceLog index setzt TIMESTAMP u.a. an erster Position des Index, und sollte somit auch bei dieser SELECT Abfrage helfen.

C0mmanda

@Rapster:

Oha, das ist blöd... :(
Aber halb so wild, alte Werte zurückgespielt (ca. 60.000) und nochmal von vorn:

set <dblog> reduceLog 31 average=day

2015.09.22 10:58:20 3: DbLog logdb: reduceLog requested.
2015.09.22 10:58:21 3: DbLog logdb: reduceLog deleting 4 records of day: 2015-07-31
2015.09.22 10:58:21 3: DbLog logdb: reduceLog (hourly-average) updating 4 records of day: 2015-07-31
2015.09.22 10:58:21 3: DbLog logdb: reduceLog deleting 3204 records of day: 2015-08-01
2015.09.22 10:58:22 3: DbLog logdb: reduceLog (hourly-average) updating 25 records of day: 2015-08-01
2015.09.22 10:58:22 3: DbLog logdb: reduceLog (daily-average) updating 4, deleting 29 records of day: 2015-08-01
2015.09.22 10:58:22 3: DbLog logdb: reduceLog deleting 3438 records of day: 2015-08-02
2015.09.22 10:58:23 3: DbLog logdb: reduceLog (hourly-average) updating 32 records of day: 2015-08-02
2015.09.22 10:58:23 3: DbLog logdb: reduceLog (daily-average) updating 4, deleting 34 records of day: 2015-08-02
2015.09.22 10:58:23 3: DbLog logdb: reduceLog deleting 293 records of day: 2015-08-03
2015.09.22 10:58:23 3: DbLog logdb: reduceLog (hourly-average) updating 16 records of day: 2015-08-03
2015.09.22 10:58:23 3: DbLog logdb: reduceLog (daily-average) updating 4, deleting 25 records of day: 2015-08-03
2015.09.22 10:58:24 3: DbLog logdb: reduceLog deleting 1239 records of day: 2015-08-04
2015.09.22 10:58:24 3: DbLog logdb: reduceLog (hourly-average) updating 44 records of day: 2015-08-04
2015.09.22 10:58:24 3: DbLog logdb: reduceLog (daily-average) updating 6, deleting 43 records of day: 2015-08-04
2015.09.22 10:58:24 3: DbLog logdb: reduceLog deleting 1702 records of day: 2015-08-05
2015.09.22 10:58:25 3: DbLog logdb: reduceLog (hourly-average) updating 120 records of day: 2015-08-05
2015.09.22 10:58:25 3: DbLog logdb: reduceLog (daily-average) updating 5, deleting 115 records of day: 2015-08-05
2015.09.22 10:58:25 3: DbLog logdb: reduceLog deleting 1578 records of day: 2015-08-06
2015.09.22 10:58:25 3: DbLog logdb: reduceLog (hourly-average) updating 120 records of day: 2015-08-06
2015.09.22 10:58:25 3: DbLog logdb: reduceLog (daily-average) updating 5, deleting 115 records of day: 2015-08-06
2015.09.22 10:58:25 3: DbLog logdb: reduceLog deleting 1599 records of day: 2015-08-07
2015.09.22 10:58:26 3: DbLog logdb: reduceLog (hourly-average) updating 120 records of day: 2015-08-07
2015.09.22 10:58:26 3: DbLog logdb: reduceLog (daily-average) updating 5, deleting 115 records of day: 2015-08-07
2015.09.22 10:58:26 3: DbLog logdb: reduceLog deleting 1772 records of day: 2015-08-08
2015.09.22 10:58:27 3: DbLog logdb: reduceLog (hourly-average) updating 122 records of day: 2015-08-08
2015.09.22 10:58:27 3: DbLog logdb: reduceLog (daily-average) updating 7, deleting 117 records of day: 2015-08-08
2015.09.22 10:58:27 3: DbLog logdb: reduceLog deleting 3712 records of day: 2015-08-09
2015.09.22 10:58:28 3: DbLog logdb: reduceLog (hourly-average) updating 168 records of day: 2015-08-09
2015.09.22 10:58:28 3: DbLog logdb: reduceLog (daily-average) updating 7, deleting 161 records of day: 2015-08-09
2015.09.22 10:58:28 3: DbLog logdb: reduceLog deleting 3422 records of day: 2015-08-10
2015.09.22 10:58:30 3: DbLog logdb: reduceLog (hourly-average) updating 168 records of day: 2015-08-10
2015.09.22 10:58:30 3: DbLog logdb: reduceLog (daily-average) updating 7, deleting 161 records of day: 2015-08-10
2015.09.22 10:58:30 3: DbLog logdb: reduceLog deleting 3332 records of day: 2015-08-11
2015.09.22 10:58:31 3: DbLog logdb: reduceLog (hourly-average) updating 168 records of day: 2015-08-11
2015.09.22 10:58:31 3: DbLog logdb: reduceLog (daily-average) updating 7, deleting 161 records of day: 2015-08-11
2015.09.22 10:58:31 3: DbLog logdb: reduceLog deleting 3380 records of day: 2015-08-12
2015.09.22 10:58:33 3: DbLog logdb: reduceLog (hourly-average) updating 168 records of day: 2015-08-12
2015.09.22 10:58:33 3: DbLog logdb: reduceLog (daily-average) updating 7, deleting 161 records of day: 2015-08-12
2015.09.22 10:58:33 3: DbLog logdb: reduceLog deleting 3178 records of day: 2015-08-13
2015.09.22 10:58:34 3: DbLog logdb: reduceLog (hourly-average) updating 168 records of day: 2015-08-13
2015.09.22 10:58:35 3: DbLog logdb: reduceLog (daily-average) updating 7, deleting 161 records of day: 2015-08-13
2015.09.22 10:58:35 3: DbLog logdb: reduceLog deleting 3151 records of day: 2015-08-14
2015.09.22 10:58:36 3: DbLog logdb: reduceLog (hourly-average) updating 168 records of day: 2015-08-14
2015.09.22 10:58:36 3: DbLog logdb: reduceLog (daily-average) updating 7, deleting 161 records of day: 2015-08-14
2015.09.22 10:58:36 3: DbLog logdb: reduceLog deleting 4882 records of day: 2015-08-15
2015.09.22 10:58:38 3: DbLog logdb: reduceLog (hourly-average) updating 285 records of day: 2015-08-15
2015.09.22 10:58:38 3: DbLog logdb: reduceLog (daily-average) updating 16, deleting 269 records of day: 2015-08-15
2015.09.22 10:58:38 3: DbLog logdb: reduceLog deleting 7280 records of day: 2015-08-16
2015.09.22 10:58:40 3: DbLog logdb: reduceLog (hourly-average) updating 384 records of day: 2015-08-16
2015.09.22 10:58:41 3: DbLog logdb: reduceLog (daily-average) updating 16, deleting 368 records of day: 2015-08-16
2015.09.22 10:58:41 3: DbLog logdb: reduceLog deleting 6301 records of day: 2015-08-17
2015.09.22 10:58:43 3: DbLog logdb: reduceLog (hourly-average) updating 384 records of day: 2015-08-17
2015.09.22 10:58:43 3: DbLog logdb: reduceLog (daily-average) updating 16, deleting 368 records of day: 2015-08-17
2015.09.22 10:58:44 3: DbLog logdb: reduceLog deleting 6823 records of day: 2015-08-18
2015.09.22 10:58:46 3: DbLog logdb: reduceLog (hourly-average) updating 384 records of day: 2015-08-18
2015.09.22 10:58:47 3: DbLog logdb: reduceLog (daily-average) updating 16, deleting 368 records of day: 2015-08-18
2015.09.22 10:58:47 3: DbLog logdb: reduceLog deleting 1962 records of day: 2015-08-19
2015.09.22 10:58:48 3: DbLog logdb: reduceLog (hourly-average) updating 128 records of day: 2015-08-19
2015.09.22 10:58:48 3: DbLog logdb: reduceLog (daily-average) updating 16, deleting 128 records of day: 2015-08-19
2015.09.22 10:58:48 3: DbLog logdb: reduceLog (daily-average) updating 3, deleting 60 records of day: 2015-08-20
2015.09.22 10:58:48 3: DbLog logdb: reduceLog executed. Rows processed: 68357, deleted: 65372, updated: 3341


Am Ende hat er 28 Sekunden gebraucht für:
2015.09.22 10:58:48 3: DbLog logdb: reduceLog executed. Rows processed: 68357, deleted: 65372, updated: 3341

Das entspricht ca. 2.300 gelöschte Werte/Sekunde und 120 updated/Sekunde.

Sieht deutlich besser aus als gestern :)


rapster

Hi C0mmanda,

ja das stimmt, jetzt schauts gut aus, super! :)

Zeitlich ist es schwer zu sagen, da dein log keine Millisekunden Werte speichert,
sind jetzt aber so grob 1,5 Sekunden pro Tag, denke das ist verschmerzbar...

Gruß
  Claudiu

C0mmanda

Das ist absolut in Ordnung, das muss ich nicht auf Millisekunden runtergebrochen haben!

Werde reduceLog als "at" jede Nacht um 1Uhr durchlaufen lassen, da merkt niemand ob fhem 1,5 oder 10sek. "hängt" ;)

Danke für die großartige Arbeit!

DrJJ

Habe mir das Modul mal installiert und dann folgenden Befehl abgesetzt set logdb reduceLog 31 average=day
Jetzt nach ca 1 Std lebt mein fhem immer noch nicht. Mache ich da was falsch oder ist die DB mit ca 1,5 Mio Einträgen zu groß?
An der Größe der Datenbank hat sich nach der Stunde auch nichts getan

rapster

Hallo DrJJ,

hast du zuvor den INDEX erstellt?

Was steht im fhem-Log? (über die Linux Commandline mit "tail fhem.log" anschauen wenn fhem gerade hängen sollte)

Die DB ändert sich erst nach abgeschlossenen Tages-Änderungen, so lange kann es eigenltich nur dauern wenn du keinen INDEX zuvor erstellt hast.

Gruß
  Claudiu

DrJJ

Danke für die Antwort. Einen Index habe ich nicht erstellt. Was muss ich dafür tun?

C0mmanda

Zitat von: DrJJ am 22 September 2015, 15:50:30
Danke für die Antwort. Einen Index habe ich nicht erstellt. Was muss ich dafür tun?

Siehe : http://forum.fhem.de/index.php/topic,41089.msg333967.html#msg333967

Du kannst die Sache jetzt natürlich einfach aussitzen oder die Brechstange rausholen und fhem killen und neustarten.
Ob da was schiefgehen kann (DB kaputt oder sowas) weiß ich leider nicht. Bin mir nicht sicher....

Ohne Index hat es bei mir auf dem Intel NUC bei ca. 330.000 Einträgen 25Std. gedauert.

grtz

rapster

Den benötigten INDEX kannst du mit diesem SQL-Befehl erstellen:

CREATE INDEX index_reduceLog ON history (TIMESTAMP,DEVICE,EVENT);

Überprüfen ob der INDEX erstellt ist/wurde kannst du folgendermaßen:

sqlite> PRAGMA INDEX_LIST('history');
0|index_reduceLog|0|c|0
1|Search_Idx|0|c|0
......
mysql> SHOW INDEXES FROM history;
......


Was für Datenbank-Typ verwendest du?
Bei SQLITE z.B. wird die DB-Datei nicht automatisch kleiner, die gelöschten Zeilen werden nur intern wieder freigegeben. Um die Datei selber zu verkleinern muss manuel VACUUM; ausgeführt werden.


DrJJ

Habe den Befehl in meiner Mysql DB ausgeführt. Index scheint erstellt zu sein. Die DB scheint laut log gerade Tageweise reduziert zu werden.

2015.09.22 15:58:08 3: DbLog logdb: reduceLog requested.
2015.09.22 15:58:50 3: DbLog logdb: reduceLog deleting 3020 records of day: 2015-04-03
2015.09.22 15:58:55 3: DbLog logdb: reduceLog (hourly-average) updating 184 records of day: 2015-04-03
2015.09.22 15:58:57 3: DbLog logdb: reduceLog (daily-average) updating 25, deleting 154 records of day: 2015-04-03
2015.09.22 15:58:58 3: DbLog logdb: reduceLog deleting 6153 records of day: 2015-04-04
2015.09.22 15:59:06 3: DbLog logdb: reduceLog (hourly-average) updating 232 records of day: 2015-04-04
2015.09.22 15:59:08 3: DbLog logdb: reduceLog (daily-average) updating 41, deleting 242 records of day: 2015-04-04
2015.09.22 15:59:09 3: DbLog logdb: reduceLog deleting 8836 records of day: 2015-04-05
2015.09.22 15:59:20 3: DbLog logdb: reduceLog (hourly-average) updating 247 records of day: 2015-04-05
2015.09.22 15:59:21 3: DbLog logdb: reduceLog (daily-average) updating 31, deleting 265 records of day: 2015-04-05
2015.09.22 15:59:24 3: DbLog logdb: reduceLog deleting 561 records of day: 2015-04-06
2015.09.22 15:59:25 3: DbLog logdb: reduceLog (hourly-average) updating 161 records of day: 2015-04-06
2015.09.22 15:59:25 3: DbLog logdb: reduceLog (daily-average) updating 19, deleting 166 records of day: 2015-04-06

rapster

Zitat von: C0mmanda am 22 September 2015, 15:56:56
Du kannst die Sache jetzt natürlich einfach aussitzen oder die Brechstange rausholen und fhem killen und neustarten.
Ob da was schiefgehen kann (DB kaputt oder sowas) weiß ich leider nicht. Bin mir nicht sicher....

Nein kann nicht wirklich was kaputt gehen,
reduceLog Ändert die DB erst wenn ein Tag vollständig verarbeitet ist.

Das einzige was passieren kann ist, das ein Tag an dem eigentlich eine hourly-'average' gesetzt werden soll einfach nur auf die ersten Einträge pro Stunde reduziert wurde (wie reduLog ohne average).
Das passiert dann wenn der Tag zwar schon vollständig aufgeräumt wurde, die hourly-average's allerding noch nicht vollständig auf den Tag angewendet wurden.

rapster

Zitat von: DrJJ am 22 September 2015, 16:02:29
Habe den Befehl in meiner Mysql DB ausgeführt. Index scheint erstellt zu sein. Die DB scheint laut log gerade Tageweise reduziert zu werden.

Schaut doch gut aus, man sieht dass du eine relativ große DB hattest, da das holen der Daten relativ lange dauerte.
Die reduzierung scheint von der Geschwindigkeit allerdings relativ OK zu sein, denke bei der Geschwindigkeit kann es allerdings trotzdem einige Minuten dauern bis reduceLog abgeschlossen ist.

Du kannst das log mit "tail -f fhem.log" folgen, damit du siehst wie es voran geht :)

Gruß
  Claudiu

DrJJ

Vielen Dank euch beiden, es scheint immer noch zu laufen. Ich denke durch den Index ist die DB jetzt noch mal etwas größer geworden. Mal abwarten wie es sich entwickelt wenn alle Tage abgearbeitet wurde.

C0mmanda

Das ist auch richtig so, steht meine ich auch in dem verlinkten Post.
Durch INDEX wird die DB um ca. ¼ größer.