2014-04-01 18 views
5

我注意到我調整的數據庫(postgres 9.2)沒有運行我感興趣的許多表的自動分析,我不明白爲什麼。我的理解/期望是基於當前的配置,autoanalyze將運行,假設表增長或修改> = 10%的行。但是,根據查詢數據庫時看到的信息,情況並非如此。自動分析不運行Postgres 9.2數據庫中的所有表

下面是從一個數據庫上pg_stat_sys_tables和pg_stat_all_tables一個已經在督促一年多運行用於運行查詢的結果集(結果截斷和真正的表名刪節)

┌────────────────────┬────────────────────────────────────┬──────────────────┬───────────────────┐ 
│  relname  │ last_autovacuum │ autovacuum_count │ last_autoanalyze │ autoanalyze_count │ 
├────────────────────┼─────────────────┼──────────────────┼──────────────────┼───────────────────┤ 
│ a_large_table  │ ¤    │    0 │ ¤    │     0 │ 
│ table_a   │ 2014-04-01  │    1 │ 2014-04-01  │     1 │ 
│ table_b   │ 2014-04-01  │    1 │ 2014-04-01  │     1 │ 
│ a_very_large_table │ ¤    │    0 │ ¤    │     0 │ 
└────────────────────┴─────────────────┴──────────────────┴──────────────────┴───────────────────┘ 

注意,表-A和表-B經常清理了舊數據,所以最近這些應用程序會進行autovacuum/autoanalyze,這是有道理的。不過,我也希望最近至少還能分析其他大型表格。

良好的措施,這裏的在postgresql.conf ...

#------------------------------------------------------------------------------ 
# AUTOVACUUM PARAMETERS 
#------------------------------------------------------------------------------ 

autovacuum = on 

log_autovacuum_min_duration = 1000 

autovacuum_max_workers = 3 

autovacuum_naptime = 1min 

autovacuum_vacuum_threshold = 100 

autovacuum_analyze_threshold = 100 

autovacuum_vacuum_scale_factor = 0.2 

autovacuum_analyze_scale_factor = 0.1 

autovacuum_freeze_max_age = 200000000 

autovacuum_vacuum_cost_delay = 20ms 

autovacuum_vacuum_cost_limit = -1 
+0

你有是在'在打開的連接交易狀態? (你可以通過'pg_stat_activity'查看) –

+0

是的。我在那個視圖上尋找什麼? –

+0

在事務'狀態中的連接保持阻止自動清除刪除死行的鎖(因爲它們沒有死,這些事務仍然看到它們)。你需要確保你用'commit'結束所有事務。你應該只在''狀態有連接。那些不會阻止autovacuum執行其工作 –

回答

0

它看起來像表應在的元組的10%被改變在真空分析。根據該構成postgresql.conf中設置,

autovacuum analyze threshold = 100 + 0.1 * table size before vacuum 

其他檢查事項:

  • 是自動清理運行? ps -ef | grep vacuum
  • 確保你不檢查備用或從服務器

請參閱從加布裏埃爾·羅斯的自動清理談話幻燈片在規模上: https://wiki.postgresql.org/images/b/b5/Groth_scale12x_autovacuum.pdf

相關問題