Eu tenho uma instrução de inserção SQL grande que atualiza uma tabela de resumo. O processo normalmente é executado a cada hora e leva cerca de 5 a 10 minutos para calcular os únicos durante esse período. Eu "tolamente" escolhi executá-lo por um período de 15 dias e estou me perguntando se há algo que eu possa fazer para obter visibilidade de onde ele está. O processo já está em execução há 9 horas. Gostaria apenas de saber se ainda é a consulta SELECT que está rodando ou se está inserindo dados: preciso saber se devo parar e fazer lotes menores, ou se devo apenas deixar terminar.
Eu sei que o servidor está nisso há 9 horas por causa dessa declaração:
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
A consulta real é:
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;
Postgres não permite leituras sujas , então precisamos de algum outro meio de verificar se as linhas estão sendo inseridas de uma segunda transação, como:
O valor retornado por esta consulta aumentará se as inserções estiverem acontecendo no momento (a menos que, eu acho, elas estejam preenchendo o espaço liberado pelas
delete
instruções anteriores).