2017-04-20 126 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 ...这让我觉得可能你的门槛太低了。确实推荐更频繁地运行真空,但在这里看起来太频繁了。像一千倍以上的时间,然后它会默认...