我试图弄清楚为什么查询花了这么长时间才能运行。当我在查询上运行EXPLAIN
时,它不会返回(等待5分钟以后)。查询是
SELECT *
FROM Foo JOIN Bar USING (FileNum, LineNum)
元组(FileNum, LineNum)
是两个表的主键。此外,(FileNum, LineNum)
是Bar
中引用Foo
的外键。
我的数据库存在性能问题,但这似乎是一种新现象。
我在数据库上运行ANALYZE
并且从那时起没有进行任何更改。
有没有人知道查询规划器为什么不返回结果?
答案 0 :(得分:0)
最简单的解释是,另一个会话已经在查询中涉及的一个表上抓取了一个AccessExclusive锁,并且不会发布它。
例如,如果另一个会话在事务中执行map["WNodeScramblingResetZone_Unlock"]
并且从不提交,则会发生这种情况。
您可以尝试查询
https://wiki.postgresql.org/wiki/Lock_Monitoring检查是否存在正在进行此类阻止的事务,然后可能使用ALTER TABLE
或pg_cancel_backend()
终止该事务。
请注意,如果阻止事务是准备好的事务:
pg_terminate_backend()
中没有相应的会话,因此任何通过pg_stat_activity
加入的查询都会错过。准备好的交易可以通过pid
看到。