我有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行。所以在相同的负载下我应该有一个恒定的执行时间,这是真的吗? 我真的需要分析表吗?经常“分析”是否可以对大型表的查询计划进行任何有用的更改?
答案 0 :(得分:1)
<强>真空强>
VACUUM回收死元组占用的存储空间。
因此它只会更改受影响的页面,但会扫描整个表格。
那就是你可能称之为&#34;标准真空&#34;。现在如果你有9.6,那么
VACUUM将根据可见性地图
跳过页面
<强>分析强>
ANALYZE
扫描depends表格大小和default_statistics_target
set per instance或每个表格的数据量 - 它本身不是30K:
对于大型表格,ANALYZE随机抽取表格内容, 而不是检查每一行......每次分析都会略有改变 即使实际的表内容没有改变,也会运行。这可能 导致计划人员的估计费用发生微小变化 解释的。
因此,如果你想要更稳定的结果,那就像使用
这样的EXPLAIN运行smthalter table ... alter COLUMN ... set STATISTICS 200;
或增加default_statistics_target,否则经常分析有更多机会改变计划。
还有一件事 - 你有5K门槛。在一个100000K行的表中它是0.002% - 对吗?所以比例是0.00002?虽然默认值为0.2或0.1 ...这让我觉得你的门槛可能太低了。建议更经常使用真空吸尘器,但这里看起来太频繁了。就像经常发生一千倍的情况一样......默认情况下......