Performance

為什麼在將 PosgreSQL 從 8.4 升級到 9.1 後,在分區的主表上執行時 autovacuum 會使用如此多的 IO?

  • February 1, 2013

我們有一個應用程序來收集基於時間戳的數據。由於一個月的數據超過 3000 萬行(並且每個月都在增長),我們決定按年和月對數據進行分區。

我們基本上有一個主表和分區表,如 master_y2013m01 等。由於我們的應用程序堆棧,我們使用前插入觸發器將行插入到正確的分區和主表中,然後使用後插入觸發器從主表中刪除它們(我們需要原始插入來返回插入的行資訊)。

這意味著主表很快就會被死元組填充並經常觸發自動清理(我們使用自動清理的預設設置)。

將我們的數據庫從 PostgreSQL 8.4 升級到 9.1 後,我們注意到 IO 大幅增加,並將其追溯到自動清理:iotop 報告 4-6M/s 的爆發需要 90 秒,然後是 30 秒的暫停。有很多數據需要仔細研究,尤其是因為主表只有幾兆字節(包括索引)。

誰能解釋為什麼會發生這種情況以及我們如何解決它?

Postgres 開發人員的幫助下,我們找到了答案,似乎從 9.0 開始,ANALYZE 在父表上執行時也會在子表上執行。由於我們的案例經常觸發 autovacuum,因此在執行之前也觸發了 ANALYZE,並且它還在分析子表。

我們決定為 autovacuum 使用更大的門檻值:

ALTER TABLE ... SET (autovacuum_analyze_threshold  = ...);

這將降低 ANALYZE 頻率並降低我們的 IO、CPU WAIT 和 LOAD 值。

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