ich suche nach einer Variante, die ich in Oracle mit DECODE gelöst hätte.
Was ist an meinem Ansatz, das ursprüngliche Value einzusetzen, wenn der Spaltenwert größer Null ist, falsch?
Select
...
sum(fd.session_duration),
case
when sum(fd.session_duration)= 0 then 1
else sum(fd.session_duration) > 0 then sum(fd.session_duration)
end
FROM
...
Aber Tools wie grep und Co. existieren, damit kann man die Daten vorab aufbereiten.
Ich finde es unschön, fehlerhafte Daten zu speichern und dann hinterher Aufwand zu betreiben, um um diese fehlerhaften Daten herumzuarbeiten. Lieber gleich die Daten richtig aufbereiten und passend in die Datenbank schreiben.
Nun, laut Readme (gerade mal gestöbert) nehmen die an, dass man die Daten in valider Form vorliegen hat (z. B. nach einem Backup).
In so einem Fall kann man sich die Validierung sparen.
Wer natürlich das Werkzeug nutzt, um an der Engine vorbei invalide Daten in die DB zu schreiben, darf sich über Schmerzen und Folgekrankheiten wirklich nicht wundern.
Die Aussage im Readme ist auch sehr eindeutig: wenn man die Datenintegrität nicht sicherstellen kann, soll man das nicht nutzen.
Da bin ich voll und ganz Deiner Meinung! Ich bin nur leider für den Input nicht verantwortlich und muss die Daten akzeptieren. Außerdem ist es ja auch nicht schlecht, wenn man manche Fehler abfangen kann.
Dann bereite die Daten vorab auf. Oder nutz nicht pg_bulkload sondern eine der anderen Möglichkeiten.
Da du offensichtlich invalide Daten an der Datenbank vorbei in die Dateien schreibst, brauchst du dich nicht zu wundern, wenn du danach mit Problemen in der Anwendung zu kämpfen hast.
Das ist doch bloß Rumdoktoren an den Symptomen und du hast auf ewig Performance Einbußen durch all die Workarounds.
Ja, aber dafür rattenschnell! Erlaubt ist, was funktioniert. Ich arbeite natürlich daran, saubere Daten zu bekommen aber möglich ist es, auf diesem Wege die Constraints zu umgehen.
Mein funktionierendes und für mich sinnvolles Statement lautet nun wie folgt:
SELECT
...
sum(fd.volume_up) as volume_up,
sum(fd.session_duration) as session_duration,
sum(case when session_duration = 0 then 0 else volume_up/session_duration end) as throughput
...
Für mich ist es wichtig, die Daten so schnell wie möglich in die DB zu bekommen, da ständig Neue folgen. Danach habe ich Zeit, die Daten aufzubereiten und zu verdichten. Ich gehe auch davon aus, dass die Daten sauber sind und werde das noch einmal besprechen. Nun, hier bei den Testdaten waren eben ein paar schwarze Schafe dabei …
Warum muss es denn “Rattenschnell” gehen … vielleicht benutzt du ja auch nur COPY falsch
Die sache ist nämlich die - du schießt dir mit dem bulk selbst ins knie merkst es aber erst wenn dir die kugel durchs linke auge in den ruecken eindringt - naemlich dann wenn du abfragen fahren musst … ich nehme mal an, dass dieses bulk keine indexe erzeugt - usw. wie soll man auf dem Ergebnis" gescheit arbeiten?
Die Daten von fünf Minuten muss ich in 2,5 Minuten importiert haben (Zielvorgabe), damit ich eine Chance habe, falls der Job einmal abbricht/scheitert, den Datenfluss wieder einzuholen. Das habe ich nur mit pg_bulkload geschafft.
halbiere oder viertel die daten doch einfach … setz entsprechend viele clients drauf an die in vier baugleiche tables inserten (partitioinen) … du wirst sehen … ist fast wie zauberei