深入了解长时间运行的 INSERT INTO ... SELECT

Fra*_*eil 7 postgresql

我有一个更新汇总表的大型 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)

Jac*_*las 8

Postgres不允许脏读,因此我们需要一些其他方法来检查是否从第二个事务插入行,例如:

select pg_relation_size('summary_show_unique_personas');
Run Code Online (Sandbox Code Playgroud)

如果当前正在发生插入,则此查询返回的值将增加(除非我认为它们正在填满先前delete语句释放的空间)。