在VACUUM和ANALYZE命令的執行過程中,系統維持著一個內部計數器來跟蹤各種被執行的I/O操作的估算開銷。當累計的代價達到一個限制(由vacuum_cost_limit指定),執行這些操作的進程將按照vacuum_cost_delay所指定的休眠一小段時間。然后它將重置計數器并繼續執行。
這個特性的出發點是允許管理員降低這些命令對并發的數據庫活動產生的I/O影響。在很多情況下,VACUUM和ANALYZE等維護命令能否快速完成并不重要,而非常重要的是這些命令不會對系統執行其他數據庫操作的能力產生顯著的影響。基于代價的清理延遲提供了一種方式讓管理員能夠保證這一點。
對于手動發出的VACUUM命令,該特性默認被禁用。要啟用它,只要把vacuum_cost_delay變量設為一個非零值。
vacuum_cost_delay (integer)
進程超過代價限制后將休眠的時間長度,以毫秒計。其默認值為0,這將禁用基于代價的清理延遲特性。正值將啟用基于代價的清理。注意在很多系統上,實際的休眠延遲單位是10毫秒,將vacuum_cost_delay設置成不為10的倍數的值和將它設置為比該值大的10的倍數的效果相同。在使用基于代價的清理時,vacuum_cost_delay的合適值通常很小,也許是10或20毫秒。調整清理時資源消耗最好的方法是調整其他清理代價參數。
vacuum_cost_page_hit (integer)
清理一個在共享緩存中找到的緩沖區的估計代價。它表示鎖住緩沖池、查找共享哈希表和掃描頁內容的代價。默認值為1。
vacuum_cost_page_miss (integer)
清理一個必須從磁盤上讀取的緩沖區的代價。它表示鎖住緩沖池、查找共享哈希表、從磁盤讀取需要的塊以及掃描其內容的代價。默認值為10。
vacuum_cost_page_dirty (integer)
當清理修改一個之前干凈的塊時需要花費的估計代價。它表示再次把臟塊刷出到磁盤所需要的額外I/O。默認值為20。
vacuum_cost_limit (integer)
將導致清理進程休眠的累計代價。默認值為200。
有些操作會保持關鍵性的鎖,這樣可以盡快完成。基于代價的清理延遲在這類操作期間不會發生。因此有可能代價會累計至大大超過指定的限制。為了防止在這種情況下的無意義的長時間延遲,實際延遲的計算方式是vacuum_cost_delay * accumulated_balance / vacuum_cost_limit,且最大值是vacuum_cost_delay * 4。