相关疑难解决方法(0)

Estimate end time for a long update

我目前正在运行一个很长的更新(基于 postgisst_within条件的~ 百万行),根据以前的类似查询预计将在一个小时左右完成。然而,已经三个小时了;系统监控显示它在那个时候将单个 CPU 固定在 100%。

有什么办法可以查看本次更新的进度,估计预计什么时候结束?

postgresql

8
推荐指数
2
解决办法
2546
查看次数

如何在 PostgreSQL 上查找数据库重建索引的进度?

运行时:

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)

postgresql index

5
推荐指数
1
解决办法
5140
查看次数

标签 统计

postgresql ×2

index ×1