统计信息简介一文介绍了统计信息的基本概念,本文将进一步解读统计信息的收集。
1. ANALYZE语法
wutongdb=# \h ANALYZE
Command: ANALYZE
Description: collect statistics about a database
Syntax:
ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]
where option can be one of:
VERBOSE [ boolean ]
SKIP_LOCKED [ boolean ]
and table_and_columns is:
table_name [ ( column_name [, ...] ) ]
URL: https://www.postgresql.org/docs/12/sql-analyze.html
ANALYZE主要有以下几种方式:
- 全库统计信息收集,可以收集整个数据库下所有表对象的统计信息。但是这种方式耗时长并且存在潜在的锁冲突风险,一般不建议在非窗口期进行全库ANALZYE操作。
- 整表统计信息收集,收集表内所有列的单列统计信息,示例
ANALYZE table_name;。 - 单列统计信息收集,仅收集表内指定列的单列统计信息,更加精确,性能更好。语法示例
ANALYZE table_name(column_name1, column_name2);
2. 样本容量
统计信息的准确性取决于样本是否可以显著代表整个表的数据分布,如果一个表的采样率达到了100%(所有的数据均被采样并用于计算统计信息),那么基于这个样本空间的统计结果一定是准确的。但是随着数据量的增多,全表的数据采入样本空间会带来内存使用过高、计算量大等问题。这时候就需要控制样本容量,尽量在有限的样本容量下采集到具有足够显著特征的数据。
梧桐数据库提供了guc参数default_statistics_target来调整采样的样本容量,该参数的默认值为100,默认的样本容量为300 x default_statistics_target = 30000条数据。根据 SIGMOD98 中的论文 Random sampling fo r histogram construction: how much is enough , 这个样本容量可以满足采样的显著性。但是随着数据量的增大,30000条数据就很难保证仍可以有效地代表整个表内的数据分布了。当表数据量较大时,如果条件选择率估算不准,可以考虑增大样本容量,一般来说使样本容量为表的20%可以较好的平衡统计信息准确性和analyze效率。
3. 采样模型
梧桐数据库使用了蓄水池采样模型,当数据量很大且不确定的情况下,蓄水池算法可以随机选取给定样本容量大小的数据,并且保证每个样本被选中的概率均相同。
3.1 采样算法
传统的采样算法包含两部分,第一部分是对表的页面进行随机采样,第二阶段则是在已选中的页面基础上对元组进行采样。元组的采样使用了蓄水池算法,思路大致如下:
- 如果接收的数据量小于m,则依次放入蓄水池。
- 当接收到第i个数据时,i >= m,在[0, i]范围内取以随机数d,若d的落在[0, m-1]范围内,则用接收到的第i个数据替换蓄水池中的第d个
- 重复步骤2。
3.2 梧桐数据库优势
梧桐数据库在传统采样算法的基础上有以下几点优化:
- 优化了蓄水池采样算法,使采样随机性更强,统计信息更准确。
- 解决了dead tuple过多情况下统计信息不准确的问题。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




