作者:
高雪玉,中国PG分会志愿者,瀚高软件工程师
03
目录
1概述 2单列统计 3扩展统计 3.1函数依赖统计 3.2N-Distinct统计 3.3MCV Lists统计 3.3.1缺点 3.3.2优点PART
1
概述
EXPLAIN展示了PostgreSQLPlanner生成的执行计划。Planner需要估计一个查询要检索的行数,这样才能对查询计划做出更好的选择。Planner收集到的数据统计是决定使用哪种规划的重要因素。 统计包含两大类:单列统计和扩展统计。 扩展统计包含以下3类,其中,MCV统计是PG12新增功能。 (1) 函数依赖统计 (2) N-Distinct统计 (3) MCV Lists统计(PG12新增)
CREATE TABLE test (x int, y int);INSERT INTO test SELECT mod(i,3),mod(i,30) FROM generate_series (1,10000) s(i);ANALYZE test;
PART
2
单列统计
单列统计信息可帮助Planner估算一个查询将返回的行数。
统计信息保存在pg_class和pg_statistics中。pg_class基本上存储了每个表和索引中的项的总数,以及每个表和索引占用的磁盘块数。pg_statistics存储关于每列的统计信息,这些信息将用于估算WHERE字句的选择度,即符合WHERE字句中每个条件的行的比例,比如:列项为空的比例stanullfrac、非空项的平均存储宽度stawidth、第N个槽位的列值,stavaluesN等。 建议手动检查统计信息使用视图 pg_stats ,而非直接访问pg_statistic。相比之下,pg_stats可以被所有用户访问并且字段值更易读。 pg_stats列含义如下:名称 |
类型 |
描述 |
schemaname |
name |
模式名 |
tablename |
name |
表名 |
attname |
name |
列名 |
inherited |
bool |
此行是否包括继承子列 |
null_frac |
real |
列项中为空的比例 |
avg_width |
integer |
列项的平均字节宽度 |
n_distinct |
real |
列中可区分值的估计个数 |
most_common_vals |
anyarray |
列中最常用值的一个列表 |
most_common_freqs |
real[] |
最常用值的频率列表 |
histogram_bounds |
anyarray |
将列值划分成大小接近的组的值列表 |
correlation |
real |
物理行顺序和列值逻辑顺序之间的统计关联 |
most_common_elems |
anyarray |
列值中最经常出现的非空元素列表 |
most_common_elem_freqs |
real[] |
最常用元素值的频度列表 |
elem_count_histogram |
real[] |
在列值中可区分非空元素值计数的一个直方图 |
通过查询pg_stats获取test表格中x列统计信息如下:
postgres=# select * from pg_stats where tablename ='test' and attname = 'x';-[ RECORD 1 ]----------+-----------------------schemaname | publictablename | testattname | xinherited | fnull_frac | 0avg_width | 4n_distinct | 3most_common_vals | {1,0,2}most_common_freqs | {0.3334,0.3333,0.3333}histogram_bounds |correlation | 0.3332most_common_elems |most_common_elem_freqs |elem_count_histogram |
为了使查询计划易于阅读,进行设置关闭每个查询的并行性。
postgres=# set max_parallel_workers_p