3

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

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

4

1 回答 1

2

真空

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

所以它只改变受影响的页面,但它会扫描整个表。

这与您可能所说的“标准真空”有关。现在如果你有 9.6,那么

VACUUM 将根据可见性地图跳过页面

分析

ANALYZE扫描的数据量取决于表大小和default_statistics_target 每个实例或每个表的设置 - 它本身不是 30K:

对于大表,ANALYZE 对表内容进行随机抽样,而不是检查每一行……每次运行 ANALYZE 时都会略有变化,即使实际表内容没有改变。这可能会导致EXPLAIN 显示的计划者估计成本发生微小变化。

因此,如果您希望 EXPLAIN 获得更稳定的结果,请运行类似

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

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

还有一件事——你有 5K 的门槛。在具有 100000K 行的表中,它是 0.002% - 对吧?所以比例是0.00002?而默认值是 0.2 或 0.1 ......这让我觉得你的阈值可能太低了。确实建议更频繁地运行真空,但在这里看起来太频繁了。就像默认情况下的一千倍一样...

于 2017-04-20T15:36:02.857 回答