Kur*_*ler 13 postgresql postgresql-9.3
我有一个批处理查询,我每天都在我的数据库上运行。但是,它似乎陷入了空闲状态,而且我在调试发生的事情时遇到了很多困难。
查询是同时插入的表上的聚合,我猜这与该问题有某种关系。(聚合基于前几天的数据,因此插入不应影响结果。)
线索
我正在使用 sqlalchemy 在 python 脚本中运行它。但是,我已将事务级别设置为自动提交,因此我不认为事务已包含在事务中。另一方面,当我在 sql 终端中手动运行查询时,我没有看到查询挂起。
通过查询pg_stat_activity
,查询最初作为state='active'
. 大约 15 秒后,状态更改为“空闲”,此外,xact_start
设置为NULL
。等待标志永远不会设置为 true。
在我弄清楚 sqlalchemy 的事务级别自动提交之前,它会挂在 state'idle in transaction'
而不是'idle'
. 自从进行更改后,它的挂起频率可能会稍微降低?
我觉得我没有能力对此进行更深入的挖掘。任何反馈,甚至在没有给出明确答案的情况下解释更多关于不同状态和相关 postgres 内部的信息,都将不胜感激。
您必须在这里分离的第一件事是查询、事务和连接这三个词。
线索:您的查询被执行 - 它处于活动状态。之后查询结束但连接保持打开 - 空闲状态。没有事务(已提交),因此xact_start
为空。所以你必须在查询成功后关闭连接。
提示:在自动提交之前,查询被留在事务中间,所以首先你必须commit
,然后close connection
。