Postgres EXPLAIN永远不会返回结果

时间:2016-06-09 16:10:51

标签: postgresql

我试图弄清楚为什么查询花了这么长时间才能运行。当我在查询上运行EXPLAIN时,它不会返回(等待5分钟以后)。查询是

SELECT *
FROM Foo JOIN Bar USING (FileNum, LineNum)

元组(FileNum, LineNum)是两个表的主键。此外,(FileNum, LineNum)Bar中引用Foo的外键。

我的数据库存在性能问题,但这似乎是一种新现象。

我在数据库上运行ANALYZE并且从那时起没有进行任何更改。

有没有人知道查询规划器为什么不返回结果?

1 个答案:

答案 0 :(得分:0)

最简单的解释是,另一个会话已经在查询中涉及的一个表上抓取了一个AccessExclusive锁,并且不会发布它。

例如,如果另一个会话在事务中执行map["WNodeScramblingResetZone_Unlock"]并且从不提交,则会发生这种情况。

您可以尝试查询 https://wiki.postgresql.org/wiki/Lock_Monitoring检查是否存在正在进行此类阻止的事务,然后可能使用ALTER TABLEpg_cancel_backend()终止该事务。

请注意,如果阻止事务是准备好的事务:

  • 锁将在服务器重启后继续存在。
  • 该交易在pg_terminate_backend()中没有相应的会话,因此任何通过pg_stat_activity加入的查询都会错过。

准备好的交易可以通过pid看到。