sql - 如何查找正在阻塞其他进程的进程
问题描述
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 服务器。
解决方案
试试下面的。它将您的查询作为 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;
我无法在笔记本电脑上演示完整的查询,因为我不喜欢阻塞。但我可以用你的数据中的几行来模拟它。
推荐阅读
- python - 如何运行 pycrate corenet
- php - 在 foreach 循环中传递多个参数,但值未保存在 DB 中
- swift - Swift 中的键值编码使用
- function - 在哪里可以找到 AzureWebJobsStorage 和 AzureWebJobsDashboard 连接字符串?
- javascript - 如何在同一页面中添加多个验证码并检查两个复选框的填充
- dart - 颤振检测上传的时区图像
- python - 获取Python中列表的所有组合,而同一字符连续重复两次
- mysql - Docker撰写MySql初始化脚本未执行
- elasticsearch - 具有多匹配弹性搜索的布尔查询中的模糊性
- angular - 获取坐标列表的地址