天天看點

PostgreSQL 長事務中DML産生的資料無法被及時納入統計資訊導緻的問題

postgresql最低的事務隔離級别是read committed,是以在事務中産生的資料變化,在外部是不可見的,包括auto analyze也是不可見的。

例子:

會話a:

會話b:

在會話a中手工執行完analyze後,生效:

由于隔離級别的原因,會話b依舊不能讀到pg_stats的版本

那麼這就會導緻一個問題。

如果會話中執行了大量的dml,資料發送了較大的變化。或者會話中有建立的臨時表,或者普通表,執行計劃可能有問題。

這個問題在複雜查詢中尤為突出。

例如有比較多的join的查詢,雖然資料量可能非常龐大,但是可能由于沒有統計資訊就走nest loop了。

優化建議:

在事務中的每條dml語句後面,加一條analyze 響應的表的操作。