Postgresql

Postgres 表因大量更新而增長

  • July 3, 2014

我的 postgres 數據庫有問題,我正在對單個表(具有 3000 個條目)執行大量更新查詢(每秒 1000 個),我可以看到該表的大小正在增長和增長。

我恢復大小的方式是進行這些查詢:

真空全[表];
重新索引表[表];

這將返回我的大小

$$ TABLE $$到原來的大小。 這對我來說很好,但問題是我必須關閉應用程序伺服器才能執行這些查詢;如果我在伺服器活著的情況下執行它們,

$$ TABLE $$尺寸減小了,但只是一點點。 我的問題簡化為 2 個問題:

  1. 如果我只是進行更新,為什麼這個表會增長?

  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 提到,為重負載配置它可能並不簡單。

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