带 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 cursor 和 LEFT JOIN
查询 运行ning。
查询基本上是说“从一个 table 中获取项目,但不会出现在另一个 table 中”。
我的数据量相当大table,这已经运行了一段时间了。
本周这些查询停止了 returning。在 pg_stat_activity
中,它们无限期地显示为 active
(超过 17 小时),在 heroku pg:ps
中也是如此。似乎没有僵局。所有 Heroku database metrics 和日志看起来都很健康。
如果我 运行 直接在控制台中进行相同的查询(没有光标),他们会在几秒钟内 return。
通过提高查询效率(从 LEFT JOIN
切换到 NOT EXISTS
;删除其中一个连接),我能够让它在游标中再次工作。
我的问题是:
- 为什么原始查询在控制台中可以正常执行,但使用 psycopg server-side 游标 return 却不能?
- 我该如何调试它?
- 本周发生了什么变化可能会触发该问题?
我可以这样说:
- 然而我写查询(
LEFT JOIN
,子查询,NOT EXISTS
),查询计划涉及一个嵌套循环反连接
- 我不认为这与第二天的 Heroku outage 有关(并且没有影响 Heroku PG)
- 经过广泛的 Google 搜索,我能找到的最接近假设的解释是 2003 年 PG 留言板上的 post,标题为 left join in cursor,其中的响应是“一些计划节点类型不能很好地应对 运行 倒退。”
感谢任何建议!
如果您使用游标,PostgreSQL 估计只有 10% 的查询结果会被快速获取,并且更喜欢 return 快速获取前几行的计划,但代价是总查询成本。
您可以通过将 PostgreSQL 参数 cursor_tuple_fraction
设置为 1.0 来禁用此优化。
我有一个 Heroku 应用程序,它在 Heroku PG 13.5 上使用 psycopg server-side cursor 和 LEFT JOIN
查询 运行ning。
查询基本上是说“从一个 table 中获取项目,但不会出现在另一个 table 中”。
我的数据量相当大table,这已经运行了一段时间了。
本周这些查询停止了 returning。在 pg_stat_activity
中,它们无限期地显示为 active
(超过 17 小时),在 heroku pg:ps
中也是如此。似乎没有僵局。所有 Heroku database metrics 和日志看起来都很健康。
如果我 运行 直接在控制台中进行相同的查询(没有光标),他们会在几秒钟内 return。
通过提高查询效率(从 LEFT JOIN
切换到 NOT EXISTS
;删除其中一个连接),我能够让它在游标中再次工作。
我的问题是:
- 为什么原始查询在控制台中可以正常执行,但使用 psycopg server-side 游标 return 却不能?
- 我该如何调试它?
- 本周发生了什么变化可能会触发该问题?
我可以这样说:
- 然而我写查询(
LEFT JOIN
,子查询,NOT EXISTS
),查询计划涉及一个嵌套循环反连接 - 我不认为这与第二天的 Heroku outage 有关(并且没有影响 Heroku PG)
- 经过广泛的 Google 搜索,我能找到的最接近假设的解释是 2003 年 PG 留言板上的 post,标题为 left join in cursor,其中的响应是“一些计划节点类型不能很好地应对 运行 倒退。”
感谢任何建议!
如果您使用游标,PostgreSQL 估计只有 10% 的查询结果会被快速获取,并且更喜欢 return 快速获取前几行的计划,但代价是总查询成本。
您可以通过将 PostgreSQL 参数 cursor_tuple_fraction
设置为 1.0 来禁用此优化。