简单的选择查询挂起

spo*_*nut 5 postgresql postgresql-9.6

我有一个简单的查询:

SELECT a.name AS a_name,
       b.description AS b_description
    FROM a
    JOIN b ON a.id = b.a_id
    WHERE b.table_name IS NULL;
Run Code Online (Sandbox Code Playgroud)

(为保护无辜者,化名)

这通常需要大约 3 毫秒才能运行。有时,此查询会挂起。目前已经挂了3天了。幸运的是,我可以暂时尝试在当前状态下对其进行调试。看起来没有任何东西阻止它(通过查询 pg_locks 和 pg_stat_activity 发现),尽管它阻止了其他事情。

即使其他查询处于挂起状态,我也可以再次运行相同的查询,并且它在预期的时间段内成功完成。

可能涉及的事情:我们目前有两个转储数据库的 cron 作业(不要问)。如果可能相关,我可以找到正在运行的确切命令。

任何有关如何调试此问题的建议都将不胜感激!

Lau*_*lbe 4

检查等待事件以pg_stat_activity查看您的查询是正在运行还是挂起。

在后一种情况下,请检查pg_locks或使用该pg_blocking_pids功能来查看哪个会话阻止了您。

如果不涉及锁,则查看后端进程是否消耗CPU。可以选择使用strace来查看后端正在做什么。