p4d: Platte voll weil Datenaggregierung nicht funktioniert hat

There are 41 replies in this Thread which was already clicked 1,010 times. The last Post () by Etaminator.

  • Für mich ist es eh' unlogisch, das "Aggregate Intervall" per Parameter einstellen zu können, der dazu passenden Offset jedoch fest hinterlegt ist (+ INTERVAL 15 MINUTE). Bei anderen Einstellungen als 15 Minuten bzw. 900 Sekunden, führt das zu unschönen Nebeneffekten.


    Warum dieser Offset von 15 Minuten überhaupt eingeführt wurde ist mir auch unklar.


    Das habe ich auch noch nicht verstanden, warum der Offset 15 Minuten ist und für was er gebraucht wird.

    Fröling Pelletskessel PE1 25 kW, Fröling Hygiene-Solarschichtspeicher H3 850, 4x Buderus Flachkollektor SKN4.0-w


    fraenk for friends Code: MATF103

  • Jetzt ist der Parameter "Historie [Tage]" = 1200 gesetzt.

    Mal sehen, was heute Nacht passiert.

    Es müssten morgen Aggregate-Werte bis Ende 2022/Anfang 2023 vorhanden sein.

    Ich habe im Skript /usr/local/bin/aggregate-samples-manual.sh nichts angepasst.

    Ich habe das SQL-Statement manuell ausgeführt.

    Hallo meute,


    auch wenn das nicht so wichtig ist, sehe ich in diesen Aussagen einen Widerspruch. Ich bin bisher davon ausgegangen, dass du das Script /usr/local/bin/aggregate-samples-manual.sh sehr wohl manuell angepasst hast, sonst kann doch die "nächtliche Automatik" nicht funktionieren?


    Und noch ein (etwas kleinlicher) Hinweis:

    Dein erster manueller Versuch der Aggregierung für "2020-09-09 12:00:00 bis 18:00:00" hat zwar (teilweise) "A"-Sätze erzeugt, diese waren aber nicht aggregiert, sondern nur dupliziert. Das betrifft zwar nur 6 Stunden, aber ich hätte diese Daten ebenfalls (korrekt) zusammengefasst haben wollen (vielleicht hast du ja auch schon darüber nachgedacht)?


    Jedenfalls sind die damals nicht aggregierten Daten inzwischen entweder nachträglich aggregiert oder durch das Delete-Script gelöscht worden. Wenn man wollte, dann könnte man für diesen Zeitraum jetzt noch die "falsch" aggregierten Daten nachträglich nochmals aggregieren, z.B. indem die falsch aggregierten Daten auf "S" zurückgesetzt werden. Der nächste Aggregate-Lauf würde die Daten dann nochmals korrekt zusammenfassen - man könnte das aber auch manuell anstoßen (mit Prüfung vorher und nachher):

    Noch ein Hinweis:

    Das obige Aggregate-SQL funktioniert (wegen der Einschränkung des Datumsbereichs) nur dann korrekt, wenn der Offset mit den 15 Minuten weggelassen wird. Das sieht man "schön" an dem von dir bereitgestellten Protokoll "p4d_Aggregate_samples_Ergebnis.sql": Dort ist der erste aggregierte Datensatz "A" mit "time = 2020-09-09 12:15:30" hinterlegt - dieser Satz ist ein Duplikat des "S" mit "time = 2020-09-09 12:15:42". Die "S"-Sätze in den 15 Minuten davor wurden (wegen dem 15-Minuten-Offset) nicht aggregiert.


    Sorry für die viele Theorie - aber ich möchte das auch für mich verstehen (alte Berufskrankheit). Du kannst das gerne ignorieren - weil wirklich wichtig ist es nicht. :saint:


    Viele Grüße von Karlheinz :)


    Nachtrag:

    Die SQLs habe ich nicht getestet, es kann also auch zu Syntax-Fehlern kommen, falls ich mich verschrieben habe...

    Seit Juni 2011:

    ETA Twin: SH30/P25 "noTouch" (Füllraum 150 Liter)

    Hopf Pelletaustragung: 6x UniWok-Saugsonden (Selbstbaulager für 6 to)

    Paradigma Pufferspeicher: 2x Aqua Expresso (1090 + 958 Liter; seriell verbunden)

    Paradigma FrischWasserStation

    Paradigma VRK-Anlage: 2x CPC21 Star Azzurro Solarpanel (10m²; Aqua-System ohne Glykol)

  • Hallo meute,


    um die Aggregation genauer zu verstehen und zu visualisieren, habe ich von deinen sample.sql Daten

    34 Zeilen "2020-09-09 12:00:42" - "2020-09-09 12:50:12" in eine leere samples Tabelle mit insert eingfügt.

    Wie schon von Karlheinz beschrieben geht das ganz gut mit zerlegten SQL-commands.


    Also die eigentliche Aggregation findet in der time2 spalte statt durch Runden der Uhrzeit auf 900 Sekunden

    mit den beiden Funktionen SEC_TO_TIME und TIME_TO_SEC statt.

    Damit man das besser sieht hab ich zusätzlich die original time-spalte vor die time2-spalte eingefügt.

    Man sieht dass die Uhrzeit jeder time-spalte in der time2-spalte auf 15Min oder 900 Sekunden gerundet wurde.


    MariaDB [p4]> select address, type, 'A' as aggregate, time,

    -> CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 900) * 900)) time2,

    -> unix_timestamp(sysdate()) as inssp, unix_timestamp(sysdate()) as updsp,

    -> value, text, samples

    -> from samples;


    Nun müssen noch die Blöcke mit der gleichen Uhrzeit in der time2 spalte mit

    group by CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 900) * 900)) in jeweils eine Aggregat-Zeile zusammgefasst werden.


    MariaDB [p4]> select address, type, 'A' as aggregate, time,

    -> CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 900) * 900)) time,

    -> unix_timestamp(sysdate()) as inssp, unix_timestamp(sysdate()) as updsp,

    -> round(sum(value)/count(*), 2) as value, text, count(*) samples

    -> from samples

    -> where aggregate != 'A'

    -> and time < "2020-09-10"

    -> group by CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 900) * 900));

    Code
    +---------+------+-----------+---------------------+---------------------+------------+------------+-------+------+---------+
    | address | type | aggregate | time                | time                | inssp      | updsp      | value | text | samples |
    +---------+------+-----------+---------------------+---------------------+------------+------------+-------+------+---------+
    |       4 | VA   | A         | 2020-09-09 12:14:12 | 2020-09-09 12:00:00 | 1778023380 | 1778023380 | 18.00 | NULL |      10 |
    |       4 | VA   | A         | 2020-09-09 12:29:12 | 2020-09-09 12:15:00 | 1778023380 | 1778023380 | 18.00 | NULL |      10 |
    |       4 | VA   | A         | 2020-09-09 12:44:12 | 2020-09-09 12:30:00 | 1778023380 | 1778023380 | 18.50 | NULL |      10 |
    |       4 | VA   | A         | 2020-09-09 12:50:12 | 2020-09-09 12:45:00 | 1778023380 | 1778023380 | 18.50 | NULL |       4 |
    +---------+------+-----------+---------------------+---------------------+------------+------------+-------+------+---------+
    4 rows in set (0,002 sec)

    Und jetzt noch das ganze mit replace in die Tabelle reinschreiben:

    MariaDB [p4]> replace into samples

    -> select address, type, 'A' as aggregate,

    -> CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 900) * 900)) time,

    -> unix_timestamp(sysdate()) as inssp, unix_timestamp(sysdate()) as updsp,

    -> round(sum(value)/count(*), 2) as value, text, count(*) samples

    -> from samples

    -> where aggregate != 'A'

    -> and time < "2020-09-10"

    -> group by CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 900) * 900));

    Query OK, 4 rows affected (0,009 sec)

    Records: 4 Duplicates: 0 Warnings: 0


    MariaDB [p4]> select * from samples;

    Was mir hierbei auffiel ist, dass die Originalzeilen erhalten blieben und die neuen Aggregat-Zeilen hinten angehängt wurden.

    Das mit "replace" auch daten insertet werden können, wusste ich bisher auch nicht. Man lernt immer wieder dazu.


    In den Unterlagen zur MariaDB ist bei "Einführung von REPLACE INTO" zu lesen.

    Die REPLACE INTOAnweisung in MariaDB ermöglicht es, sowohl Einfügungen als auch Aktualisierungen mit einem einzigen SQL-Befehl durchzuführen.

    Die grundlegende Syntax ähnelt der von `setup` INSERT INTO, jedoch mit einer Besonderheit:

    Existiert bereits eine Zeile mit dem angegebenen Primärschlüssel oder eindeutigen Index, wird diese gelöscht und durch die neue Zeile ersetzt,

    was von außen wie eine Aktualisierungsoperation aussieht.


    Also die samples-Tabelle wird durch das Aggregieren zuerst mal grösser um die Anzahl der neuen Aggregat-Zeilen.

    In diesem Beispiel steigt die Anzahl der Einträge von 34 auf 38 Zeilen in der samples-Tabelle.

    Die anschliessende Bereinigung mit dem delete-statement von aggregate != 'A' räumt dann wieder auf.


    MariaDB [p4]> delete from samples

    -> where aggregate != 'A'

    -> and time < "2020-09-10";

    Query OK, 34 rows affected (0,009 sec)


    In diesem Beispiel hat eine Aggregation die samples-Tabelle von 34 Zeilen auf 4 Zeilen, auf ca. ein zehntel reduziert.

    Das bringt schon was und würde deine über 100 Millionen-record samples-Tabelle schon deutlich verkleinern und würde deine Space-Probleme beseitigen.


    Das Aggregation-Bereinigung-script manuell aufgerufen mit den zwei Parametern Datum und Zeitintervall

    funkioniert auch mit anderen Zeitintervallen als den 15 Minuten.



    z.B ./aggregate-samples-manual.sh 2020-09-10 1800

    MariaDB [p4]> select * from samples;

    +---------+------+-----------+---------------------+------------+------------+-------+------+---------+

    | address | type | aggregate | time | inssp | updsp | value | text | samples |

    +---------+------+-----------+---------------------+------------+------------+-------+------+---------+

    | 4 | VA | A | 2020-09-09 12:45:00 | 1778023065 | 1778023065 | 18.50 | NULL | 14 |

    | 4 | VA | A | 2020-09-09 12:15:00 | 1778023065 | 1778023065 | 18.00 | NULL | 20 |

    +---------+------+-----------+---------------------+------------+------------+-------+------+---------+

    2 rows in set (0,001 sec)


    Gruß

    Jürgen

    Atmos D15P mit A25; LambdaCheck; UVR1611 mit CAN-I/O44, BL-NET und CMI ;
    2x1000l Puffer mit 2x10m² VRK und glykolfreie Solarthermie(Ost-West); WW-FWS; zentrale Wasserenthärtung;

    PV 3,2 kWp EEG; PV-Insel 6 kWp mit Victron MultiPlus-II 48/5000/70-50 und 8 x PylonTech LiFePo4 Modul 48V 2,4 kWh US2000 mit BMS; Victron Cerbo-GX;

    Herkules SE 5000 DF DIESEL Elektrostart Stromerzeuger Generator 2x220V-1x380V, Dauerleistung 4.200 Watt, 11 Stunden Dauerbetrieb, Tankinhalt 13,3 l

  • Und noch ein (etwas kleinlicher) Hinweis:

    Dein erster manueller Versuch der Aggregierung für "2020-09-09 12:00:00 bis 18:00:00" hat zwar (teilweise) "A"-Sätze erzeugt, diese waren aber nicht aggregiert, sondern nur dupliziert. Das betrifft zwar nur 6 Stunden, aber ich hätte diese Daten ebenfalls (korrekt) zusammengefasst haben wollen (vielleicht hast du ja auch schon darüber nachgedacht)?

    Doch, auch diese Zeiten passen jetzt. ;)

    Das war ja der erste Versuch.

    Und zu dem Zeitpunkt wurde noch auf Sekunden und nicht auf Minuten aggregiert.

    Da kannte ich den Faktor 60 (Sekunden zu Minuten umrechnen) noch nicht.

    Die Daten habe ich wieder gelöscht. :S


    Aber gut aufgepasst. ^^


    Fröling Pelletskessel PE1 25 kW, Fröling Hygiene-Solarschichtspeicher H3 850, 4x Buderus Flachkollektor SKN4.0-w


    fraenk for friends Code: MATF103

    Edited once, last by meute ().

  • Doch, auch diese Zeiten passen jetzt. ;)

    Das war ja der erste Versuch.

    Und zu dem Zeitpunkt wurden noch auf Sekunden und nicht auf Minuten aggregiert.

    Da kannte ich den Faktor 60 (Sekunden zu Minuten umrechnen) noch nicht.

    Die Daten habe ich wieder gelöscht.

    Hallo meute,


    ich finde es echt super, wie du dich in eine (vermutlich) vorher unbekannte Thematik reinwühlst! 8)


    Einen kleinen Wermutstropfen muss ich aber noch nachreichen:

    In den nachaggregierten Daten (time=2020-09-09 12:xx:00) sieht man, dass für das Intervall 12:15:00 keine Daten (mehr) vorliegen. Das liegt daran, weil dort der (unnötige) 15-Minuten-Offset zugeschlagen hat und die Daten der ersten 15 Minuten nicht aggregiert und mit "A" markiert wurden. Durch das nächste spätere "Delete" auf die stehengeblieben "S"-Sätze wurden diese Daten gelöscht. Nun könnte man diese fehlenden Daten anhand des alten Protokolls per Insert nachträglich wieder einfügen und manuell (oder auch automatisch) aggregieren (lassen) - aber diese kleine Lücke wird wohl nie auffallen. Ich wollte lediglich der Vollständigkeit halber darauf hinweisen. ;)


    Übrigens hat Jürgen SolarEngel in seiner sehr gut gemachten Erläuterung ebenfalls auf den 15-Minuten-Offset verzichtet. Andernfalls wären in seiner selektierten Teilmenge ebenfalls die ersten 15 Minuten nicht aggregiert worden. :thumbup:


    Wäre es mein Projekt, dann würde ich das SQL-Script entsprechend abändern (und dadurch vereinfachen), auch wenn das "Problem" normalerweise nur bei den allerersten Daten in der Tabelle samples auftritt (oder eben in selektierten Teilmengen). Wie weiter oben schon erwähnt, ist es sowieso "unsauber", zwar das Aggregations-Intervall per Variable an das Script zu übergeben, den damit zusammenhängenden Minuten-Offset jedoch nicht. Vielleicht wollt ihr diesen Aspekt ja in eines der nächsten Updates einfließen lassen... :/


    Viele Grüße von Karlheinz :)

    Seit Juni 2011:

    ETA Twin: SH30/P25 "noTouch" (Füllraum 150 Liter)

    Hopf Pelletaustragung: 6x UniWok-Saugsonden (Selbstbaulager für 6 to)

    Paradigma Pufferspeicher: 2x Aqua Expresso (1090 + 958 Liter; seriell verbunden)

    Paradigma FrischWasserStation

    Paradigma VRK-Anlage: 2x CPC21 Star Azzurro Solarpanel (10m²; Aqua-System ohne Glykol)

  • meute,


    ich finde es echt super, wie du dich in eine (vermutlich) vorher unbekannte Thematik reinwühlst! 8)

    Danke, aber so ganz unbekannt ist mir SQL nicht. ;)


    Übrigens hat Jürgen SolarEngel in seiner sehr gut gemachten Erläuterung ebenfalls auf den 15-Minuten-Offset verzichtet. Andernfalls wären in seiner selektierten Teilmenge ebenfalls die ersten 15 Minuten nicht aggregiert worden. :thumbup:


    Wäre es mein Projekt, dann würde ich das SQL-Script entsprechend abändern (und dadurch vereinfachen), auch wenn das "Problem" normalerweise nur bei den allerersten Daten in der Tabelle samples auftritt (oder eben in selektierten Teilmengen).

    Solange sich horchi nicht dazu äußert, warum er die 15 Minuten eingebaut hat, können wir nur mutmaßen.


    Ansonsten könnte man auch einen Pull request stellen:

    linux-p4d/scripts/aggregate-samples-manual.sh at master · horchi/linux-p4d
    Deamon which fetch sensor data of the 'Lambdatronic s3200' and store to a MySQL database - horchi/linux-p4d
    github.com

    Fröling Pelletskessel PE1 25 kW, Fröling Hygiene-Solarschichtspeicher H3 850, 4x Buderus Flachkollektor SKN4.0-w


    fraenk for friends Code: MATF103

  • Sorry ich habe das Problem noch nicht verstanden ..

    - was die Aggregation macht und wofür sie ist das ist klar und nicht die Frage?

    - die 15 Minuten sind der default aber einstellbar und auch nirgends hard-coded sofern ich bei check gerade nicht übersehen habe

    Könnt Ihr mir bitte erläutern was nicht geht bzw. was die Farge ist?

    Seit Oktober 2009:
    Fröling P4 mit 1000l Pufferspeicher

  • - was die Aggregation macht und wofür sie ist das ist klar und nicht die Frage?

    - die 15 Minuten sind der default aber einstellbar und auch nirgends hard-coded sofern ich bei check gerade nicht übersehen habe

    Hallo horchi,


    ich melde mich nochmal, weil ich mich weiter oben eingemischt habe und weil ich meute helfen wollte. ;)


    Wie die Aggregation funktioniert, ist (glaube ich) inzwischen allen klar.


    Der Ausgangspunkt der von mir angestoßenen Diskussion war folgendes:

    Die "fixen" 15 Minuten beziehen sich auf das oben verlinkte script aggregate-samples-manual.sh.

    Dort steht zweimal der Ausdruck "+ INTERVAL 15 MINUTE".

    Das wäre Hard-Coded und würde nicht zum Übergabeparameter "interval [minutes]" passen, sofern dieser nicht auch "15" wäre.

    Diesen Ausdruck "INTERVAL 15 MINUTE) könnte/müsste man natürlich ebenfalls variabel machen.

    M.E. ist dieses "INTERVAL 15 MINUTE" ein unnötiger Offset und ich würde es ganz weglassen.

    Aber vielleicht übersehe ich ja auch etwas?


    Viele Grüße von Karlheinz :)

    Seit Juni 2011:

    ETA Twin: SH30/P25 "noTouch" (Füllraum 150 Liter)

    Hopf Pelletaustragung: 6x UniWok-Saugsonden (Selbstbaulager für 6 to)

    Paradigma Pufferspeicher: 2x Aqua Expresso (1090 + 958 Liter; seriell verbunden)

    Paradigma FrischWasserStation

    Paradigma VRK-Anlage: 2x CPC21 Star Azzurro Solarpanel (10m²; Aqua-System ohne Glykol)

  • Ich habe jetzt nochmal im code geschaut, wo ist es denn hard coded


    asprintf(&stmt,

    "replace into samples "

    " select address, type, 'A' as aggregate, "

    " CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV %d) * %d)) + INTERVAL %d MINUTE time, "

    " unix_timestamp(sysdate()) as inssp, unix_timestamp(sysdate()) as updsp, "

    " round(sum(value)/count(*), 2) as value, text, count(*) samples "

    " from "

    " samples "

    " where "

    " aggregate != 'A' and "

    " time <= from_unixtime(%ld) "

    " group by "

    " CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV %d) * %d)) + INTERVAL %d MINUTE, address, type;",

    aggregateInterval * tmeSecondsPerMinute, aggregateInterval * tmeSecondsPerMinute, aggregateInterval,

    history,

    aggregateInterval * tmeSecondsPerMinute, aggregateInterval * tmeSecondsPerMinute, aggregateInterval);


    tell(eloAlways, "Starting aggregation ...");

    Seit Oktober 2009:
    Fröling P4 mit 1000l Pufferspeicher

  • Hallo Jörg,


    im Skript "aggregate-samples-manual.sh" steht:

  • ahh okay, ich kann das Erweitern sodass man es als Parameter mitgeben kann. Grundsätzlich ist es so gedacht das der p4d das alles macht. Das Script war mal zum Testen.

    Seit Oktober 2009:
    Fröling P4 mit 1000l Pufferspeicher

  • M.E. ist dieses "INTERVAL 15 MINUTE" aber unnötig und ich würde es ganz weglassen.

    Wäre das nicht einfacher?

    Seit Juni 2011:

    ETA Twin: SH30/P25 "noTouch" (Füllraum 150 Liter)

    Hopf Pelletaustragung: 6x UniWok-Saugsonden (Selbstbaulager für 6 to)

    Paradigma Pufferspeicher: 2x Aqua Expresso (1090 + 958 Liter; seriell verbunden)

    Paradigma FrischWasserStation

    Paradigma VRK-Anlage: 2x CPC21 Star Azzurro Solarpanel (10m²; Aqua-System ohne Glykol)

  • Ich meine, dass der durchgestrichene Ausdruck redundant, bzw. sogar schädlich ist. Lässt man den Ausdruck weg, braucht man ihn auch nicht parametrieren.

    Seit Juni 2011:

    ETA Twin: SH30/P25 "noTouch" (Füllraum 150 Liter)

    Hopf Pelletaustragung: 6x UniWok-Saugsonden (Selbstbaulager für 6 to)

    Paradigma Pufferspeicher: 2x Aqua Expresso (1090 + 958 Liter; seriell verbunden)

    Paradigma FrischWasserStation

    Paradigma VRK-Anlage: 2x CPC21 Star Azzurro Solarpanel (10m²; Aqua-System ohne Glykol)

  • Hallo horchi.


    Nachtrag:

    Mangels eigener Kenntnis des Projekts p4d bin ich bisher davon ausgegangen, dass p4d das besagte Script "aggregate-samples-manual.sh" verwendet. Jetzt weiß ich, dass die SQL-Aggregierung vom Programm generiert wird. Dort wäre natürlich derselbe "Issue" zu korrigieren. ;)


    In diesem Zusammenhang wäre es eine Überlegung wert, generell das externe Script aufzurufen. Das Script zum Testen ist ja durchaus sinnvoll und (spätere) Änderungen wären nur an einer Stelle erforderlich. Aber das ist eine Designfrage und es ist dein Projekt.


    Viele Grüße von Karlheinz :)

    Seit Juni 2011:

    ETA Twin: SH30/P25 "noTouch" (Füllraum 150 Liter)

    Hopf Pelletaustragung: 6x UniWok-Saugsonden (Selbstbaulager für 6 to)

    Paradigma Pufferspeicher: 2x Aqua Expresso (1090 + 958 Liter; seriell verbunden)

    Paradigma FrischWasserStation

    Paradigma VRK-Anlage: 2x CPC21 Star Azzurro Solarpanel (10m²; Aqua-System ohne Glykol)

  • 1)
    ich möchte es (zumindest aus jetziger Sicht) lieber im Code belassen statt ein externes Skript aufzurufen - kann ich aber bei Gelegenheit nochmal drüber nachdenken.

    2)
    zu den 15 Minuten, das absichtlich konfigurierbar, manche wollen ggf.über andere Intervalle aggregieren -

    3)

    weglassen der 15 Minuten ...
    wie stellst du dir die Aggregation vor?

    Die 15 Minuten Alias 900 Sekunden geben den Intervall an über welchen aggregiert wird.
    Hier ein Beispiel mit den ersten paar Ergebnissen der Aggregation - zur besseren Übersichtlichkeit mit nur einem Sensor:


    Du kannst mir das Statement welches dir vorschwebt ja mal mit paar Ergebnissen posten dann verstehe ich sicher besser worauf du hinaus möchtest.

    Seit Oktober 2009:
    Fröling P4 mit 1000l Pufferspeicher

  • ahh jetzt ... ich sehe/verstehe nun was du meinst!

    ich habe damit das speichern auf das Ende des Zeitabschnitts geschoben also z.B. die Werte von 14:00-14:15 unter 14:15 statt unter 14:00 gespeichert, kam mir damals besser vor. Unterm Strich spielt es aber nicht wirklich eine Rolle und ist so vermutlich verwirrender.

    Die 15 Minuten müssen dennoch konfigurierbar bleiben wenn die Intervalle nicht fix sein sollen, also auch ohne INTERVALL wie hier:

    Code
    select address, type, 'A' as aggregate, time as 'time-S', CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 900) * 900))  'time-A', unix_timestamp(sysdate()) as inssp, unix_timestamp(sysdate()) as updsp, round(sum(value)/count(*), 2) as value, text, count(*) samples from samples where aggregate != 'A' and type = 'VA' and address = 2 and time <= from_unixtim
    e(1778232222) and time > from_unixtime(1777368392)  group by CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 900) * 900)), address, type limit 10;

    Seit Oktober 2009:
    Fröling P4 mit 1000l Pufferspeicher

  • Dass die Daten über ein einstellbares Zeitintervall aggregiert werden müssen, stellt niemand in Frage. Es geht lediglich darum, den unnötigen Ausdruck "INTERVAL 15 MINUTE" wegzulassen.

    Code
    MariaDB [p4]> replace into samples
    select address, type, 'A' as aggregate, CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 900) * 900)) time, unix_timestamp(sysdate()) as inssp, unix_timestamp(sysdate()) as updsp, round(sum(value)/count(*), 2) as value, text, count(*) samples
    from samples
    where aggregate != 'A'
    and time < "2020-09-10" 
    group by CONCAT(DATE(time), ' ', SEC_TO_TIME((TIME_TO_SEC(time) DIV 900) * 900));

    Ich nehme mal das obige Beispiel von SolarEngel. Dort hat er den Ausdruck "INTERVAL 15 MINUTE" weggelassen und es funktioniert (m.E. sogar besser). ;)


    Dieses INTERVAL wirkt als Offset auf die Startdaten, was dazu führt, dass die Daten auf das obere Intervall-Ende aggregiert werden. Das ist ungewöhnlich und macht das SQL unnötig komplex. Daher finde ich diesen Ausdruck redundant.


    Ich kann es leider nicht besser erklären. Bin grad nur am Handy, aber später könnte ich das noch mit einem Beispiel belegen, falls gewünscht...


    Viele Grüße von Karlheinz :)


    Nachtrag:

    Unsere Beiträge haben sich zeitlich überschnitten.

    Seit Juni 2011:

    ETA Twin: SH30/P25 "noTouch" (Füllraum 150 Liter)

    Hopf Pelletaustragung: 6x UniWok-Saugsonden (Selbstbaulager für 6 to)

    Paradigma Pufferspeicher: 2x Aqua Expresso (1090 + 958 Liter; seriell verbunden)

    Paradigma FrischWasserStation

    Paradigma VRK-Anlage: 2x CPC21 Star Azzurro Solarpanel (10m²; Aqua-System ohne Glykol)

  • Hallo,


    Aggregate läuft nun wie es soll.

    Es werden täglich alle Daten älter als 365 Tage aggregiert.


    Dadurch sind nun die Daten in der Tabelle samples massiv geschrumpft.

    Die Tabelle samples enthält nur noch 13 GB Daten.

    Die Datenbankdatei samples.ibd ist aber 21 GB groß.


    Deshalb wollte ich die Datenbankdatei samples.ibd verkleinern.

    Hat das schon mal jemand gemacht und kann dazu was sagen?


    Ich vermute, das geht vermutlich am Besten so:

    - Tabelle samples löschen

    - Tabelle samples neu erstellen

    - Backup samples importieren


    Hier habe ich mal notiert, wie ich es machen würde.

    Kann da bitte mal jemand drüberschauen, ob das so passen kann oder ob ich was vergessen habe.


    Code
    #
    # Linux
    #
    
    # Dienst p4d – stoppen
    sudo systemctl stop p4d.service
    
    # Anmelden an Datenbank p4
    mysql -u p4 -pp4 p4



    Fröling Pelletskessel PE1 25 kW, Fröling Hygiene-Solarschichtspeicher H3 850, 4x Buderus Flachkollektor SKN4.0-w


    fraenk for friends Code: MATF103

    Edited once, last by meute ().

  • Hallo meute,


    ich würde die Methode OPTIMIZE TABLE samples; bevorzugen. Vorher natürlich den p4d-Dienst beenden und die Daten sichern.

    MariaDB verkleinern optimieren defragmentieren


    Viele Grüße von Karlheinz :)

    Seit Juni 2011:

    ETA Twin: SH30/P25 "noTouch" (Füllraum 150 Liter)

    Hopf Pelletaustragung: 6x UniWok-Saugsonden (Selbstbaulager für 6 to)

    Paradigma Pufferspeicher: 2x Aqua Expresso (1090 + 958 Liter; seriell verbunden)

    Paradigma FrischWasserStation

    Paradigma VRK-Anlage: 2x CPC21 Star Azzurro Solarpanel (10m²; Aqua-System ohne Glykol)

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!