Ich habe eine große SQL-Insert-Anweisung, die eine Übersichtstabelle aktualisiert. Der Prozess wird normalerweise stündlich ausgeführt und dauert etwa 5 bis 10 Minuten, um die Eindeutigkeiten in diesem Zeitraum zu berechnen. Ich habe mich "dumm" dafür entschieden, es über einen Zeitraum von 15 Tagen laufen zu lassen, und ich frage mich, ob ich irgendetwas tun kann, um einen Überblick darüber zu bekommen, wo es sich befindet. Der Prozess läuft bereits seit 9 Stunden. Ich möchte einfach wissen, ob noch die SELECT-Abfrage ausgeführt wird oder ob Daten eingefügt werden: Ich muss wissen, ob ich sie stoppen und kleinere Stapel ausführen soll oder ob ich sie einfach beenden lassen soll.
Ich weiß, dass der Server aufgrund dieser Aussage seit 9 Stunden dabei ist:
select
now() - xact_start
, procpid
, client_addr
, client_port
, current_query
from pg_stat_activity
where xact_start is not null
order by 1 desc
Die eigentliche Abfrage lautet:
INSERT INTO summary_show_unique_personas(period, show_id, persona_id, interactions_count)
SELECT
date_trunc('hour', created_at) AS period
, show_id
, persona_id
, COUNT(*)
FROM
twitter_interactions
JOIN show_bindings USING(interaction_id)
JOIN twitter_personas USING(screen_name)
WHERE
created_at >= '__PERIOD_START_AT__' AND created_at < '__PERIOD_END_AT__'
AND interaction_created_at >= '__PERIOD_START_AT__' AND interaction_created_at < '__PERIOD_END_AT__'
GROUP BY
1, 2, 3;
quelle
Antworten:
Postgres erlaubt keine Dirty Reads, daher benötigen wir andere Methoden, um zu überprüfen, ob Zeilen aus einer zweiten Transaktion eingefügt werden, z.
Der von dieser Abfrage zurückgegebene Wert erhöht sich, wenn gerade Einfügungen ausgeführt werden (es sei denn, ich denke, sie füllen den durch vorherige
delete
Anweisungen freigegebenen Speicherplatz aus ).quelle