我目前正在运行一个很长的更新(基于 postgisst_within条件的~ 百万行),根据以前的类似查询预计将在一个小时左右完成。然而,已经三个小时了;系统监控显示它在那个时候将单个 CPU 固定在 100%。
有什么办法可以查看本次更新的进度,估计预计什么时候结束?
运行时:
REINDEX DATABASE CONCURRENTLY mydb;
Run Code Online (Sandbox Code Playgroud)
这可能需要几个小时,甚至几天,具体取决于数据库的大小,是否有办法粗略估计其进度?
我看到一些论坛帖子声称您可以使用如下查询来查询索引创建状态:
SELECT
now()::TIME(0),
a.query,
p.phase,
p.blocks_total,
p.blocks_done,
p.tuples_total,
p.tuples_done,
FROM pg_stat_progress_create_index p
JOIN pg_stat_activity a ON p.pid = a.pid;
Run Code Online (Sandbox Code Playgroud)
_done / _total 列与阶段相结合确实提供了粗略的进度百分比。但是,这仅列出当前更新索引的进度。它不会告诉您有多少其他索引正在等待更新,更不用说每个索引需要做多少工作了。
编辑:我尝试将 views 结合起来pg_index,其中列出了*_ccnew并发进程使用的临时索引,例如pg_stat_progress_create_index:
SELECT relname,
CASE WHEN blocks_total > 0 THEN (ci.blocks_done/ci.blocks_total::numeric*100)::int ELSE NULL END as blocks_percent,
i.*
FROM pg_class as pgc
inner join pg_index as i on i.indexrelid = pgc.oid
left outer join pg_stat_progress_create_index as ci on ci.index_relid = i.indexrelid
WHERE i.indisvalid = false; …Run Code Online (Sandbox Code Playgroud)