2017-04-20 47 views
2

我有Postgres 9.4.7,我有一個大表〜100M行和20列。表查詢每分鐘1.5k選擇,150插入和300更新,但不刪除。這是我的自動清理配置:PostgreSQL真空大表

autovacuum_analyze_scale_factor 0
autovacuum_analyze_threshold 5000
autovacuum_vacuum_scale_factor 0
autovacuum_vacuum_threshold 5000
autovacuum_max_workers 6
autovacuum_naptime 5S

在我的案例數據庫幾乎都是在真空的恆定狀態。當一個吸塵過程結束時另一個開始。

所以主要問題: 是否有一種常見的方式來吸大表?

下面是一些其他問題。

標準真空不掃描整個表,「分析」只掃描30k行。所以在相同的負載下,我應該有一個持續的執行時間,這是真的嗎? 我真的需要分析表嗎?頻繁的「分析」可以在大型表格的查詢計劃中進行任何有用的更改嗎?

+0

你有9.6?..如果不是聲明'標準真空不掃描整個表是錯誤的 –

回答

1

真空

VACUUM回收由死元組佔據的存儲。

因此它只更改受影響的頁面,但會掃描整個表格。

這就是你可能稱之爲「標準真空」的東西。現在,如果你有9.6,然後

真空將根據能見度地圖上跳過網頁

分析數據的

ANALYZE掃描depends上表規模和default_statistics_targetset per instance或每表 - 它本身不是30K:

對於大型表格,ANALYZE採用表格內容的隨機樣本, 而不是檢查每行......每次運行ANALYZE 時都會略微更改,即使實際表格內容沒有更改。這可能 導致計劃者的估計成本小變化 解釋。

所以,如果你想爲EXPLAIN運行平穩像

alter table ... alter COLUMN ... set STATISTICS 200; 

或default_statistics_target提高更穩定的結果,否則往往分析有更多的機會來改變計劃。

還有一件事 - 你有5K的門檻。在10萬行的表中,它是0.002% - 對嗎?所以規模是0.00002?而默認值爲0.2或0.1 ...這讓我覺得可能你的門檻太低了。確實推薦更頻繁地運行真空,但在這裏看起來太頻繁了。像一千倍以上的時間,然後它會默認...