PostgreSQL查询计划器依靠有关表内容的统计信息来生成良好的查询计划。这些统计信息由ANALYZE命令收集,该命令可以自行调用,也可以作为VACUUM
. 拥有相当准确的统计数据很重要,否则计划选择不当可能会降低数据库性能。
如果启用了 autovacuum 守护程序,它将ANALYZE
在表的内容发生充分变化时自动发出命令。但是,管理员可能更喜欢依赖手动调度的ANALYZE
操作,特别是如果已知表上的更新活动不会影响“有趣”列的统计信息时。守护进程ANALYZE
严格根据插入或更新的行数进行调度;它不知道这是否会导致有意义的统计变化。
分区中更改的元组和继承子项不会触发对父表的分析。如果父表为空或很少更改,则可能永远不会被 autovacuum 处理,并且不会收集整个继承树的统计信息。必须ANALYZE
手动在父表上运行,以保持统计信息最新。
与清理空间恢复一样,频繁更新统计信息对于频繁更新的表比对很少更新的表更有用。但是即使对于一个频繁更新的表,如果数据的统计分布没有太大变化,也可能不需要更新统计信息。一个简单的经验法则是考虑表中列的最小值和最大值的变化量。例如,timestamp
包含行更新时间的列将随着行的添加和更新而不断增加最大值;这样的列可能需要比包含在网站上访问的页面的 URL 的列更频繁的统计信息更新。URL 列可能会经常收到更改,但其值的统计分布可能会相对缓慢地更改。
可以ANALYZE
在特定表甚至表的特定列上运行,因此如果您的应用程序需要,可以灵活地比其他更频繁地更新某些统计信息。然而,在实践中,通常最好只分析整个数据库,因为它是一种快速操作。ANALYZE
使用表格行的统计随机抽样,而不是读取每一行。