Postgresql:default_statistics_target 值的真正含义是什么?

Luc*_*ini 14 postgresql

增加 default_statistics_target 值可以使您的数据库更快,特别是在分析之后....

阅读这篇文章我看到https://discuss.pivotal.io/hc/en-us/articles/201581033-default-statistics-target-Explained

(...) 简而言之,这个参数控制着统计数据的收集方式,值 1 是估计最少/准确的统计数据,值 1000 是最准确的统计数据,显然会消耗时间/资源(CPU、内存等)/空间。通常默认值足以获得准确的计划,但如果您有复杂的数据分布/或查询中经常引用一列,则设置更高的值可能有助于获得更好的表统计信息,因此优化器执行的更好计划。

这是一个很好的解释,但例如,如果我设置 default_statistics_target= 1000 1000 真正意味着什么?正在生成 1000 KB 的统计数据?或者它可能是分析的表的 1000 行?也许是 1000 列?或者每次分析可能需要 1000 秒...

所以我的问题是这个数字是如何真正影响分析或查询规划器的?很明显,我知道 default_statistics_target = 1000 将获得比 100 更多的时间,用于运行分析,并且 1000 将生成更好的统计数据......

jja*_*nes 19

它将300 * default_statistics_target从每个表中采样行。它将使用该样本来确定default_statistics_target要存储在该数组中的最常见值,以及default_statistics_target要存储在该数组中的直方图边界。加上其他一些标量统计信息,例如不同值的数量。

选择乘数 300 是因为一些统计理论说,这是您希望计算的每个直方图边界需要采样的数量,以便您的采样直方图边界具有可接受的不确定性水平。

最常见的值列表用于帮助规划器预测等式表达式的选择性,例如where state='CA'。直方图边界用于帮助规划器预测不等式或范围表达式的选择性,例如where income between 55000 and 64000

  • 对于那些感兴趣的人,postgres 的源代码 [here](https://github.com/postgres/postgres/blob/REL_11_STABLE/src/backend/commands/analyze.c#L1832) 和那里引用的研究论文是 [here](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.53.1734&rep=rep1&type=pdf) (6认同)