Postgresql

同一會話中的功能在同時執行多次時變得越來越慢

  • June 24, 2020

x86_64-pc-linux-gnu 上的 PostgreSQL 12.2 (Ubuntu 12.2-2.pgdg18.04+1),由 gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 編譯,64 位

客戶端是 Data Grip 和我的報表伺服器的相同行為,它使用 Jaspersoft 附帶的驅動程序

我在同一會話下多次執行相同的函式以使用不同的參數進行報告。也使用相同的參數做同樣的事情。

這些是一個接一個地執行,而不是同時執行。

結果只有幾行,但確實從很多表中讀取,沒有寫入。

它只是表連接並且不選擇表本身的輸入或更新(希望能夠發布查詢,但出於安全原因不能)。

在我執行該功能幾次後,它開始變慢並達到不可接受的水平。例如,其中一個功能從 1 秒到超過 90 秒(這就是我停止測試的地方)。

故障排除:

我已經去伺服器並終止了會話,然後它開始正常執行了幾次。

標準報告確實使用了臨時表,但我已將其刪除以進行測試。在開始出現問題後,我執行了以下命令來嘗試解決問題。

VACUUM 所有接觸過的表;- 我知道這不應該是必需的,因為這些表沒有重大變化,但幾乎嘗試了任何事情。語言 plpgsql。

SET SESSION AUTHORIZATION DEFAULT;
RESET ALL;
DEALLOCATE ALL;
CLOSE ALL;
UNLISTEN *;
SELECT pg_advisory_unlock_all();
DISCARD PLANS;
DISCARD SEQUENCES;
DISCARD TEMP;

如果沒有單獨的應用程序或腳本通過作業執行,似乎沒有一種終止空閒連接的好方法。

進一步的數據點:當查看帶有 的執行計劃時auto_explain,我看到$1從第六次執行開始的計劃。

由於問題是錯誤的通用計劃(症狀:從第六次執行開始執行變得更慢)並且您使用的是 PostgreSQL v12,因此解決方案很簡單:

ALTER FUNCTION xy SET plan_cache_mode = force_custom_plan;

引用自:https://dba.stackexchange.com/questions/269671