PostgreSQL吸尘大桌子

时间:2017-04-20 14:23:16

标签: postgresql vacuum autovacuum

我有Postgres 9.4.7,我有一个大表~100M行和20列。表查询是1.5k选择,150次插入和每分钟300次更新,但没有删除。这是我的autovacuum配置:

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行。所以在相同的负载下我应该有一个恒定的执行时间,这是真的吗? 我真的需要分析表吗?经常“分析”是否可以对大型表的查询计划进行任何有用的更改?

1 个答案:

答案 0 :(得分:1)

<强>真空

  

VACUUM回收死元组占用的存储空间。

因此它只会更改受影响的页面,但会扫描整个表格。

那就是你可能称之为&#34;标准真空&#34;。现在如果你有9.6,那么

  

VACUUM将根据可见性地图

跳过页面

<强>分析

ANALYZE扫描depends表格大小和default_statistics_target set per instance或每个表格的数据量 - 它本身不是30K:

  

对于大型表格,ANALYZE随机抽取表格内容,   而不是检查每一行......每次分析都会略有改变   即使实际的表内容没有改变,也会运行。这可能   导致计划人员的估计费用发生微小变化   解释的。

因此,如果你想要更稳定的结果,那就像使用

这样的EXPLAIN运行smth
alter table ... alter COLUMN ... set STATISTICS 200;

或增加default_statistics_target,否则经常分析有更多机会改变计划。

还有一件事 - 你有5K门槛。在一个100000K行的表中它是0.002% - 对吗?所以比例是0.00002?虽然默认值为0.2或0.1 ...这让我觉得你的门槛可能太低了。建议更经常使用真空吸尘器,但这里看起来太频繁了。就像经常发生一千倍的情况一样......默认情况下......