Hallo Florian,

mit etwas mehr Zeit kann ich Dir jetzt ausführlicher antworten. Zur Erinerung nochmal das Statement (mit kleinen Optimierungen):

-- delete - all channels
delete from data
where id in (
    select id from (
        select o.channel_id, o.id,
        (
            select max(timestamp)
            from data i_p
            where i_p.channel_id = o.channel_id
                and i_p.timestamp < o.timestamp
        ) as prev_ts,
        p.id as prev_id, p.value as prev_value,
        (
            select min(timestamp)
            from data i_n
            where i_n.channel_id = o.channel_id
                and i_n.timestamp > o.timestamp
        ) as next_ts,
        n.id as next_id, n.value as next_value
        from data o
left join data p on p.timestamp = prev_ts and o.channel_id = p.channel_id left join data n on n.timestamp = next_ts and o.channel_id = n.channel_id where o.channel_id in (select id from entities where class = "channel")
            and p.value = o.value
            and n.value = o.value
            and o.value = 0
    )
)


On 15.04.2013 22:34, Florian Knodt wrote:
Nabend die Dritte,

das ist jetzt die 0-Wert-Löschung? Er sucht 3 aufeinanderfolgende Werte eines Kanals und löscht wenn alle 0 sind den Mittleren, richtig?


Wenn Du Dir das innere SELECT anschaust siehst Du, dass alle Datensätze zurückgegeben werden, die den gleichen Wert aufweisen wie der vorherige und nächste Datensatz im gleichen Kanal- das sind also die "innenliegenden" Datensätze einer Folge. Mit dem äußeren SELECT wird diese Liste auf die IDs reduziert und der Löschung zugeführt. Die Einschränkung auf Nullwerte erfolgt mit dem letzten Teil der WHERE-Clause.

Am 2013-04-14 20:22, schrieb Andreas Goetz:
eine Optimierung welche mir für vzcompress noch einfiele wäre die
Löschung (nicht nur Komprimierung) redundanter Nullwerte.

Bei MeterInterpreter die nullen, bei SensorInterpreter aufeinanderfolgende und identische Werte würde ich sagen - wenns bei letzterem gleich bleibt sollte das ähnlich funktionieren.

Guter Punkt. Wenn Die den letzten Teil der WHERE-Clause (=0) weglässt, ist jetzt auch dieser Fall mit abgedeckt.

0-Strecke einsparen. Die letzte 0 wird benötige, damit das Frontend
keine Rampen in die Darstellung einbaut.

Guter Punkt, das hätte ich glatt verpennt…

Leider funktioniert das nach meinen Tests trotzdem nicht. Die Werte stehen korrekt in der DB, werden per JSON korrekt zurückgeliefert, aber im Chart wird die letzte Null eines Bereiches ignoriert. Ursache ist mir nicht klar.

Nachteilig ist natürlich dass man nich tmehr so einfach auf der
Datenbank Werte mehrerer Kanäle für einen Timestamp "zusammenjoinen"
kann

...und ggf. nicht so weit im Frontend zoomen kann - afair zeigt das nichts an wenn keine Daten vorhanden sind. Wenn wir den ganzen (Sonnen)Tag von 0 reden und z.B. auf Stundenansicht gehen könnte das ggf. auch etwas seltsam aussehen

Auch ein guter Punkt- aber das gleiche Problem, welches auch bei Komprimierung der Werte besteht, oder? Im SQL könnte man den maximalen Zoomraum durch Einschränkung der WHERE-Clause vor Löschung schützen:

            ...
            and p.timestamp < o.timestamp - 1*60*1000
            and n.timestamp > o.timestamp - 1*60*1000

damit sind dann nur Datensätze betroffen, deren Vorgänger und Nachfolger _innerhalb_ eines angegebenen Intervalls liegen (vmtl. müsste man sich aber eher auf den Intervallanfang/ende konzentrieren- das braucht noch etwas Bastelei). Der Weg sollte der gleiche sein.

Wie wär's- bekommen wir das in die Neuimplementierung noch mit rein?
"noch"? ich mach von meiner Seite keinen Schreibschutz drauf und deklariere es als fertig ;) Spaß beiseite: Ist notiert und hört sich erfolgsversprechend an, wenn ich etwas Zeit bekomme und der Schleifenbug raus ist schau ichs mir an.

Ich bin gespannt- gibts eigentlich ein GIT dafür?

Viele Grüße,
Andreas

Antwort per Email an