Ronny Seffner ronny@seffner.de wrote:
Hier ist jetzt noch nicht das Einfügen mit drin - das Insert kannst Du aber vor ads Select machen. Deine Ursprungstabelle ist dann um die aggregierten Zeilen gekürzt - hier alle, da keine Where-Condition da war.
Zuerst das WHERE. Wenn mich nur die 16 Uhr Einträge interessieren:
with move as (delete from acct where date_trunc('hour',stamp_inserted) = '2014-12-23 16:00:00' returning *) select mac_src, mac_dst, ip_src, ip_dst, port_src, port_dst, ip_proto, sum(packets), sum(bytes), date_trunc('hour',stamp_inserted) from acct where date_trunc('hour',stamp_inserted) = '2014-12-23 16:00:00' group by mac_src, mac_dst, ip_src, ip_dst, port_src, port_dst, ip_proto, date_trunc('hour',stamp_inserted);
Und nun das INSERT dazu, weil ich die Daten ja zusammengeführt weiter nutzen will. Bis hier her hab ich die vorgekaute Syntax sogar verstanden, aber
test=# select * from ronny; s1 | s2 | ts | val ----+----+---------------------+----- 1 | 2 | 2014-12-23 10:00:01 | 10 1 | 2 | 2014-12-23 12:00:01 | 12 1 | 2 | 2014-12-23 13:00:03 | 22 (3 rows)
Time: 0,189 ms test=*# create table ronny_ziel (s1 int, s2 int, ts timestamp, val int); CREATE TABLE Time: 15,266 ms test=*# with move as (delete from ronny returning *) insert into ronny_ziel select s1, s2, date_trunc('hour',ts), sum(val) from ronny group by s1, s2, date_trunc('hour',ts); INSERT 0 3 Time: 0,621 ms test=*# select * from ronny; s1 | s2 | ts | val ----+----+----+----- (0 rows)
Time: 0,144 ms test=*# select * from ronny_ziel ; s1 | s2 | ts | val ----+----+---------------------+----- 1 | 2 | 2014-12-23 10:00:00 | 10 1 | 2 | 2014-12-23 12:00:00 | 12 1 | 2 | 2014-12-23 13:00:00 | 22 (3 rows)
Da hab ich das Insert in die ronny_ziel mit eingebaut.
Die wiederholten date_trunc() und WHERE kostet nicht unnötig Ressourcen?
Nö.
Depends. Wenn der PK woanders als Foreign Key dienen sollte dann eher nicht. Hinreichend aktuelle Versionen zeigen dies an:
v9.1.14 und kein "Referenced by". Was meinst Du zu den Indizes? Geschrieben
Ich hab grad noch mal geschaut, die Syntax mit dem WITH und der Weiterverarbeitung von dem, was da rauskommt (nennt sich writeable Common Table Expressions) wurde in 9.1 eingeführt, das sollte also gehen.
Die Ausgabe in psql, welche Tabellen auf diese referenzieren, kam aber glaube ich erst später, dabin ich mir nicht sicher.
in die DB wird alle 5min, den Job zum Zusammenführen lass ich 1x stündlich laufen, wirklich reingucken in die Daten wird man zwei drei Mal im Monat.
Ach gott, aller 5 Minuten schreiben ist ja keine Last. Laß den Index halt, wenn Du Dir nicht sicher bist.
Das sind alles so Dinge, die bei PG halt cool sind ...
Offenbar.
PG kann Dinge wo auch Oracle alt aussieht. DDL in Transaktionen kann Oracle erst seit kurzem, PG schon immer. Exclusion Constraints kann keine andere DB.
Andreas