我有一个更新汇总表的大型 SQL 插入语句。该过程通常每小时运行一次,大约需要 5 到 10 分钟来计算该时间段内的唯一身份。我“愚蠢地”选择在 15 天的时间内运行它,我想知道我是否可以做些什么来了解它的位置。该过程已经运行了 9 个小时。我只是想知道它是否仍在运行 SELECT 查询,或者它是否正在插入数据:我需要知道我是否应该停止它并执行较小的批次,或者我是否应该让它完成。
由于该声明,我知道服务器已经使用了 9 个小时:
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
实际查询是:
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不允许脏读,所以我们需要一些其他方法来检查行是否从第二个事务中插入,例如:
如果当前正在进行插入,则此查询返回的值将会增加(除非我认为它们正在填充先前
delete
语句释放的空间)。