【发布时间】:2020-11-27 02:56:55
【问题描述】:
我使用 Python 和 psycopg2 2.8.6 对抗 Postgresql 11.6(也在 11.9 上尝试过)
当我运行查询时
CREATE TABLE tbl AS (SELECT (row_number() over())::integer "id", "col" FROM tbl2)
代码卡住了(cursor.execute 永远不会返回),用pg_terminate_backend 终止事务会从服务器中删除查询,但代码没有释放。然而在这种情况下,目标表被创建。
没有任何东西会锁定事务。内部SELECT 查询本身已经过测试,并且运行良好。
我尝试分析服务器上的线索,发现pg_stat_activity内部有以下内容:
- 事务
state是idle in transaction -
wait_event_type是Client -
wait_event是ClientRead
当我在 SQL 编辑器 (pgModeler) 中运行查询时,会发生同样的效果,但在这种情况下,查询卡住 strong> 开启Idle 状态并创建目标表。
我不确定出了什么问题以及如何从这里开始。 谢谢!
【问题讨论】:
-
在这里看起来类似的问题,stackoverflow.com/questions/11306583/…
-
那么你的“标准 SQL 编辑器”也有同样的问题。信不信由你:如果会话在事务中空闲并且等待从客户端读取,这正是它正在做的事情。是客户感到困惑并坐以待毙而不是继续。
-
@LaurenzAlbe,它发生在这种特定类型的查询(查询本身很长,并且包含对约 500 列的引用)具有不同的数据库实例和表(也是长查询)和 2 种不同类型的 SQL编辑。也在 v11.7 上转载。它只发生在 CREATE TABLE AS SELECT 或 SELECT INTO 查询中,日志中没有报告任何特殊情况。有什么方法可以跟踪连接到底发生了什么以及为什么 Postgres 认为连接是等待并且客户端卡住了? Tnx
-
您必须跟踪或调试客户端代码。如果查询时间过长,可能会有超时导致行为不端,但我只是猜测。如果在这两种情况下都使用了 psycopg2,那么问题可能就在那里。我可以保证这与数据库服务器无关。
-
SELECT (row_number() over())::integer "id", "col" FROM tbl2返回什么? ;-) 另外,您是否期望表的副本或计算表随时间更新(VIEW)?
标签: python sql postgresql psycopg2 pgmodeler