[vz-dev] Alternative Implementierung für vzcompress
Andreas Goetz
cpuidle at gmx.de
Tue Apr 16 10:55:48 CEST 2013
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
More information about the volkszaehler-dev
mailing list