如何调试空闲查询?


13

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

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

线索

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

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

  3. 在弄清楚sqlalchemy的事务级别自动提交之前,它会挂在状态'idle in transaction'而不是'idle'。自进行更改以来,它挂起的频率可能会稍微降低一些?

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


2
如果状态为空闲且未等待,则查询完成,但未关闭与数据库的连接。事务中的空闲状态也意味着查询已完成,但未COMMIT发出任何查询来结束事务。这听起来像你的问题可能会比其他地方分贝..
Joishi Bodio

是的,我认为您是对的。问题在于Python如何处理查询,而不是数据库问题。
Kurt Spindler

Answers:


6

您首先需要在这里分开的词是查询事务连接

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

  2. 提示:在进行自动提交之前,查询保留在事务的中间,因此您首先必须commit然后close connection

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.