首页 > 解决方案 > 如何查找正在阻塞其他进程的进程

问题描述

Postgres 12+ 查询

select pid, 
  pg_blocking_pids(pid) AS blocking_pids 
from pg_stat_activity 

返回每个进程的阻塞进程。

在此处输入图像描述

如何在此查询中再添加一列,当进程阻塞其他进程时这是真的,它的 pid 在任何 blocking_pids 列数组中。

在 pid 为 7968 的示例结果行中,值应为 true。并且所有其他行都应该具有错误值。

我试过了

select pid, 
  pid in pg_blocking_pids() AS isblocking,
  pg_blocking_pids(pid) AS blocking_pids 
from pg_stat_activity 

但这会导致错误,因为pg_blocking_pids()需要过程参数。使用 Postgres 12 和 13 服务器。

标签: sqlpostgresql

解决方案


试试下面的。它将您的查询作为 CTE 运行,主查询与 CTE 进行横向自连接,在 pg_blocking_pids 函数的结果数组中查找 PID。

with blockers(pid,blocking_pids) as 
     (select pid  
           , pg_blocking_pids(pid)  
        from pg_stat_activity
     ) 
select b1.pid, b1.blocking_pids, s1.blocker
  from blockers b1 
  left join lateral ( select 'Yes' blocker  
                       from blockers b2
                      where b1.pid = any (b2.blocking_pids)
            ) s1 
         on true; 

我无法在笔记本电脑上演示完整的查询,因为我不喜欢阻塞。但我可以用你的数据中的几行来模拟它。


推荐阅读