Postgres 表因大量更新而增長
我的 postgres 數據庫有問題,我正在對單個表(具有 3000 個條目)執行大量更新查詢(每秒 1000 個),我可以看到該表的大小正在增長和增長。
我恢復大小的方式是進行這些查詢:
真空全[表]; 重新索引表[表];
這將返回我的大小
$$ TABLE $$到原來的大小。 這對我來說很好,但問題是我必須關閉應用程序伺服器才能執行這些查詢;如果我在伺服器活著的情況下執行它們,
$$ TABLE $$尺寸減小了,但只是一點點。 我的問題簡化為 2 個問題:
如果我只是進行更新,為什麼這個表會增長?
如何在不關閉應用伺服器的情況下解決這個問題?
非常感謝您的時間和您的回复。
更新:Postgres 版本從 8.3.x 到 9.x
Update-2:問題是因為某個應用程序保持空閒連接保持活動狀態,通過終止連接並執行真空,所有問題都得到了解決。
您的表在僅進行更新時增長的原因是 PostgreSQL 是“被更新刪除或廢棄的元組不會從其表中物理刪除;它們會一直存在,直到 VACUUM 完成。”
當然,當您每秒更新 1000 行時,您的更新
VACUUM FULL
可能與REINDEX
.您可能不應該使用該
FULL
選項。見: http ://www.postgresql.org/docs/9.1/static/sql-vacuum.html“普通的 VACUUM(沒有 FULL)只是簡單地回收空間並使其可供重用。這種形式的命令可以與正常的表讀寫並行操作,因為沒有獲得排他鎖。”
如果這還不足以解決您的問題,也許您可以在您的工作中包含由您的應用程序伺服器驅動的
VACUUM
和。REINDEX
然後定期從更新行切換到執行VACUUM
.編輯:請注意,有 3 條評論指出這
autovacuum
是一個可以持續執行的過程。但是,dezso 提到,為重負載配置它可能並不簡單。