Estimate end time for a long update

Pet*_*ris 8 postgresql

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

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

Luc*_*ini 9

我知道这个问题很老,但我在 postgresql 中监控我的所有更新,包括事务内的更新..所以我决定提供帮助!

1- 例如,首先创建一个名为myprogress的序列。

create sequence myprogress; 
Run Code Online (Sandbox Code Playgroud)

2- 进行更新以达到序列 - 现在您可以自由地开始交易

对于例如,如果你有这样的更新

update mytable set c=3 where a=0 and b=1; 
Run Code Online (Sandbox Code Playgroud)

只需重写为(加上这个条件):

update mytable set c=3 where ( a=0 and b=1 ) and  NEXTVAL('myprogress')!=0;
Run Code Online (Sandbox Code Playgroud)

**您可以在事务中运行此更新,因为序列会受到全局影响。**

请注意,这不会显着影响性能。

3- 监控您的进度。现在您可以连接到另一个会话(或事务)并选择您的序列(序列受到全局影响,因此您将在另一个会话中看到该值):

select last_value from myprogress; 
Run Code Online (Sandbox Code Playgroud)

并且您将看到到目前为止有多少行受到您的查询的影响,这样您就可以估计更新命中了多少行。

在大多数情况下,您需要等待多少时间...

4-最后只是重新启动序列:

alter sequence myprogress restart with 1; 
Run Code Online (Sandbox Code Playgroud)

所以你可以再次使用它 - 但要小心,如果两个用户使用相同的序列,不要相信这一点。如果您有自己的进度序列,并且只有您的权限,那么您会更好。

您可以将它用于慢速 SELECT、DELETE 和某些 INSERT!


Erw*_*ter 5

您无法可靠地预测何时完成。
但您可以调查进度意外缓慢的原因。

检查并发事务中的锁:
https ://wiki.postgresql.org/wiki/Lock_Monitoring

也许并发连接数太多?
https://wiki.postgresql.org/wiki/Number_Of_Database_Connections

或者停滞/停滞事务/会话阻塞/锁定资源?在 Postgres 9.2 或更高版本中,检查pg_stat_activity可疑活动:

SELECT * FROM pg_stat_activity;
Run Code Online (Sandbox Code Playgroud)

特别要检查:

  • state = 'idle':大多无害:不执行任何操作的开放会话。例如,您将拥有其中一些带有连接池的东西。

  • state = 'idle in transaction': 潜在的问题!尚未提交且仍不执行任何操作的开放事务。

  • waiting = TRUE: 潜在的问题!当前正在等待锁的打开事务。


当然,您的服务器也可能承受 RDBMS 外部的负载。我将从 Linux / Unix 系统开始top......但这超出了这个问题的范围。