我有一個 Heroku 應用程式,它使用 psycopg服務器端游標以及 LEFT JOIN在 Heroku PG 13.5 上運行的查詢。
該查詢基本上說“從一個表中獲取專案,這些專案不會出現在另一個表中”。
我的資料量非常穩定,并且已經運行了一段時間。
本周這些查詢停止回傳。在pg_stat_activity它們出現active無限期(17 小時以上),類似地在heroku pg:ps. 似乎沒有僵局。所有Heroku 資料庫指標和日志看起來都很健康。
如果我直接在控制臺中運行相同的查詢(沒有游標),它們會在幾秒鐘內回傳。
通過提高查詢效率(從 切換LEFT JOIN到NOT EXISTS; 洗掉其中一個連接),我能夠讓它在游標中再次作業。
我的問題是:
- 為什么原始查詢可能在控制臺中執行良好,但不能使用 psycopg 服務器端游標回傳?
- 我該如何除錯呢?
- 本周可能發生了什么變化來觸發這個問題?
我可以這么說:
- 但是我撰寫查詢(
LEFT JOIN,子查詢,NOT EXISTS),查詢計劃涉及嵌套回圈反連接 - 我不認為這與第二天的Heroku 中斷有關(并且沒有影響 Heroku PG)
- 經過廣泛的谷歌搜索,我能找到最接近假設來解釋這一點的是 2003 年 PG 留言板上的一篇題為left join in cursor的帖子,其中的回應是“一些計劃節點型別不能很好地應對向后運行。”
任何建議表示贊賞!
uj5u.com熱心網友回復:
如果您使用游標,PostgreSQL 估計只有 10% 的查詢結果會被快速獲取,并且更喜歡快速回傳前幾行的計劃,但會犧牲總查詢成本。
您可以通過將 PostgreSQL 引數設定cursor_tuple_fraction為 1.0 來禁用此優化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434797.html
