如何调试空闲查询?

Kur*_*ler 13 postgresql postgresql-9.3

我有一个批处理查询,我每天都在我的数据库上运行。但是,它似乎陷入了空闲状态,而且我在调试发生的事情时遇到了很多困难。

查询是同时插入的表上的聚合,我猜这与该问题有某种关系。(聚合基于前几天的数据,因此插入不应影响结果。)

线索

  1. 我正在使用 sqlalchemy 在 python 脚本中运行它。但是,我已将事务级别设置为自动提交,因此我不认为事务已包含在事务中。另一方面,当我在 sql 终端中手动运行查询时,我没有看到查询挂起。

  2. 通过查询pg_stat_activity,查询最初作为state='active'. 大约 15 秒后,状态更改为“空闲”,此外,xact_start设置为NULL。等待标志永远不会设置为 true。

  3. 在我弄清楚 sqlalchemy 的事务级别自动提交之前,它会挂在 state'idle in transaction'而不是'idle'. 自从进行更改后,它的挂起频率可能会稍微降低?

我觉得我没有能力对此进行更深入的挖掘。任何反馈,甚至在没有给出明确答案的情况下解释更多关于不同状态和相关 postgres 内部的信息,都将不胜感激。

Sim*_*stö 6

您必须在这里分离的第一件事是查询事务连接这三个词。

  1. 线索:您的查询被执行 - 它处于活动状态。之后查询结束但连接保持打开 - 空闲状态。没有事务(已提交),因此xact_start为空。所以你必须在查询成功后关闭连接。

  2. 提示:在自动提交之前,查询被留在事务中间,所以首先你必须commit,然后close connection