Postgresql

在所有符合特定條件的表上執行 VACUUM

  • December 16, 2019

我有一個包含 100 多個表的大型數據庫。其中一些表太大了,在它們上執行 VACUUM 需要幾個小時,所以我不想在這些表上執行它。有什麼方法可以使用動態表列表執行 VACUUM,即如下所示?

VACUUM (SELECT table_name FROM information_schema.tables WHERE table_name not in ['list', 'of', 'big', 'tables'])

當然可以手動列出所有表名,但理想情況下我希望有一種動態的方法。

…表太大了,在它們上執行 VACUUM 需要幾個小時,所以我不想在這些表上執行它。

這實際上可能適得其反

你說 VACUUM 需要幾個小時,但它實際上什麼作用嗎?它會從表中刪除任何元組嗎?

如果對該表進行了大量事務更新,則必須在一段時間內清除“死”行(通過 VACUUM’ing)。如果你不這樣做,那麼你的應用程序的性能將開始迅速走下坡路,因為 PostgreSQL 必須在越來越多的死行中導航。

您正在執行哪個版本的 PostgreSQL?你可能會發現它正在自動為你做 VACUUM’ing。

如果您仍然想這樣做,那麼編寫一個查詢來“選擇” VACUUM 語句,將它們假離線到一個文件中並將該文件作為 SQL 執行:

select 'vacuum ' || table_name || ';' ddl 
from information_schema.tables 
where ... 

引用自:https://serverfault.com/questions/995688