ANALYZE 收集有关 PostgreSQL 表的内容的统计,然后把结果保存在系统表 pg_statistic 里.随后,查询规划器就可以使用这些统计帮助判断查询的最有效的 规划.
如果没有参数,ANALYZE 检查在当前数据库里的所有 表.如果有参数,ANALYZE 只检查那个表. 你还可以给出一列字段名字,这个时候只有那些字段的统计信息被更新.
周期性地运行 ANALYZE,或者在对表的 大部分内容做了更改之后马上运行它是个好习惯, 准确的统计信息将帮助规划器选择最合适的查询规划,并因此 而改善查询处理的速度.一种比较经常采用的策略是每天在 低负荷的时候运行一次 VACUUM 和 ANALYZE.
和 VACUUM FULL 不同的是, ANALYZE 只需要在目标表上有一个读取锁, 因此它可以和表上的其它活动并行地运行.
对于大表,ANALYZE 采集表内容的一个随机的抽样做 统计,而不是检查每一行.这样即使是很大的表,我们也只需要很少的一些 时间就可以完成分析.不过要注意的是统计只是近似的结果,而且每次 运行ANALYZE都会有一些小变化,即使表内容实际上 没有改变也这样.这样会导致 EXPLAIN 所显示的 规划器计算的开销有一些小变化,
收集的统计信息通常包括一个每字段最常用数值的列表以及 一个包线图,显示每个字段里数据的近似分布.如果 ANALYZE 认为它们都没有什么用, (比如,在一个唯一键字的字段上没有公共的数值) 或者是该字段数据类型不支持相关的操作符, 那么它们都可以忽略.在用户手册 中有关于统计的更多信息.
分析的广度可以通过用调整 default_statistics_target 参变量, 或者是以每字段为基础通过用 ALTER TABLE ALTER COLUMN SET STATISTICS (参阅 ALTER TABLE) 设置每字段的统计目标来控制.目标数值设置最常用数值列表中的记录的最大 数目以及包线图中的最大块数.缺省的目标数值是 10,不过我们可以调节 这个数值获取规划器计算精度和 ANALYZE 运行所需要的 时间以及 pg_statistic 里面占据的空间数目之间的 平衡.特别是,把统计目标设置为零就关闭了该字段的统计收集. 对那些从来不参与到查询的 WHERE,GROUP BY,或者 ORDER BY 子句里的字段 是很有用的,因为规划器不会使用到这样的字段上的统计.
在被分析的字段中最大的统计目标决定为统计采样的表中的行的数目. 增大目标会导致做 ANALYZE 的时候成比例地 增大对时间和空间的需求.