带 LEFT JOIN 的 Postgres server-side 游标在 Heroku PG 上不 return

Postgres server-side cursor with LEFT JOIN does not return on Heroku PG

我有一个 Heroku 应用程序,它在 Heroku PG 13.5 上使用 psycopg server-side cursorLEFT JOIN 查询 运行ning。

查询基本上是说“从一个 table 中获取项目,但不会出现在另一个 table 中”。

我的数据量相当大table,这已经运行了一段时间了。

本周这些查询停止了 returning。在 pg_stat_activity 中,它们无限期地显示为 active(超过 17 小时),在 heroku pg:ps 中也是如此。似乎没有僵局。所有 Heroku database metrics 和日志看起来都很健康。

如果我 运行 直接在控制台中进行相同的查询(没有光标),他们会在几秒钟内 return。

通过提高查询效率(从 LEFT JOIN 切换到 NOT EXISTS;删除其中一个连接),我能够让它在游标中再次工作。

我的问题是:

我可以这样说:

感谢任何建议!

如果您使用游标,PostgreSQL 估计只有 10% 的查询结果会被快速获取,并且更喜欢 return 快速获取前几行的计划,但代价是总查询成本。

您可以通过将 PostgreSQL 参数 cursor_tuple_fraction 设置为 1.0 来禁用此优化。