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


11

增加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会生成更好的统计信息...

Answers:


16

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

之所以选择乘法器300,是因为某种统计理论认为,要使采样的直方图范围具有可接受的不确定性水平,每个希望计算的直方图范围需要采样多少个。

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


6
对于那些感兴趣的人,此处的 300个幻数在postgres的源代码中进行说明,在此处引用的研究论文也位于此处
maahl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.