是否有设置控制 PostgreSQLANALYZE
命令扫描的记录/页面数量?看起来默认情况下它会扫描 30,000 页和 30,000 条记录。在PostgreSQL服务器配置文件清单吨的选项,但我没有看到任何具体到ANALYZE
。
表的每一列都有一个attstattarget
属性(存储在 中pg_attribute
),它告诉从 收集的统计样本中应该为它存储多少数据ANALYZE
。
它默认为default_statistics_target
,而它本身默认为100
。
在规划师使用的统计信息中,文档说:
ANALYZE 存储在 pg_statistic 中的信息量,特别是每列的 most_common_vals 和 histogram_bounds 数组中的最大条目数,可以使用 ALTER TABLE SET STATISTICS 命令逐列设置,或通过设置全局设置default_statistics_target 配置变量
30,000
页和行背后的原因是 ANALYZE 考虑的行中的样本大小是采样表300
的最大值的倍attstattarget
,这将是默认值100
。
的300
来自于所述源代码中提到的统计式
src/backend/commands/analyze.c
:
/*--------------------
* The following choice of minrows is based on the paper
* "Random sampling for histogram construction: how much is enough?"
* by Surajit Chaudhuri, Rajeev Motwani and Vivek Narasayya, in
* Proceedings of ACM SIGMOD International Conference on Management
* of Data, 1998, Pages 436-447. Their Corollary 1 to Theorem 5
* says that for table size n, histogram size k, maximum relative
* error in bin size f, and error probability gamma, the minimum
* random sample size is
* r = 4 * k * ln(2*n/gamma) / f^2
* Taking f = 0.5, gamma = 0.01, n = 10^6 rows, we obtain
* r = 305.82 * k
* Note that because of the log function, the dependence on n is
* quite weak; even at n = 10^12, a 300*k sample gives <= 0.66
* bin size error with probability 0.99. So there's no real need to
* scale for n, which is a good thing because we don't necessarily
* know it at this point.
*--------------------
*/
stats->minrows = 300 * attr->attstattarget;
Run Code Online (Sandbox Code Playgroud)
至于页数,由于行不跨页,因此最多N
将读取页以获取N
行。我相信ANALYZE
故意旨在获取最大的页面以获得最佳样本。这是有道理的,因为存储在同一页面中的行更有可能相关。
归档时间: |
|
查看次数: |
1213 次 |
最近记录: |