我有一个更新汇总表的大型 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
Run Code Online (Sandbox Code Playgroud)
实际查询是:
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;
Run Code Online (Sandbox Code Playgroud)
Postgres不允许脏读,因此我们需要一些其他方法来检查是否从第二个事务插入行,例如:
select pg_relation_size('summary_show_unique_personas');
Run Code Online (Sandbox Code Playgroud)
如果当前正在发生插入,则此查询返回的值将增加(除非我认为它们正在填满先前delete
语句释放的空间)。