和Oracle 一样,PostgreSQL 的表也有柱状图, 用于保存表的列的统计信息。可以通过查询系统视图 pg_stats.histogram_bounds 来查看列的柱状图。
官网关于柱状图的描述
Histogram_bounds
A list of values that divide the column is values into groups of approximately
equal population. The values in most_common_vals, if present, are omitted from this
histogram calculation. (This column is NULL if the column data type does not have
a < operator or if the most_common_vals list accounts for the entire population.)
上面这段英文对英文基础不好的人来说,可能有点费力;偶读了半天,也似懂非懂,但第一句话提供了重要信息, 说柱状图是指一系列的值将表的列值分成近似相同的组;这句话可能翻译得不太好,等下通过实验来了解一下,就明白了。histogram_bounds 的值受参数 default_statistics_target 控制。default_statistics_target 默认值为100,default_statistics_target参数值越大,那么PG搜集的列上的统计信息就越精确,当然在表做 Analyze 操作时花费的时间也稍长些。
参数 default_statistics_target 的描述
default_statistics_target (integer)
Sets the default statistics target for table columns without a column-specific
target set via ALTER TABLE SET STATISTICS. Larger values increase the time needed to
do ANALYZE, butmight improve the quality of the planner is estimates. The default is
- For moreinformation on the use of statistics by the PostgreSQL query planner,
refer to Section 14.2.
场景一: attstattarget 1000 时的场景
pg_attribute.attstattarget 是指列上统计信息搜集指标,默认值为系统 default_statistics_target ,当attstattarget 值为 -1 时, 表示使用系统的 “default_statistics_target”值,关于这个参数详见官网文档。
查看默认参数值
1 |
skytf=> show default_statistics_target; |
查看表 test_11 的表 id上的 attstattarget 参数
1 |
skytf=> select oid,relname from pg_class where relname='test_11'; |
备注:从上面看出,表 test_11 的列 id上的 attstattarget 参数为 -1 ,即使用了系统的参数 default_statistics_target 值 100.
创建测试表并测试数据
1 |
create table test_11 (id integer ,name varchar(32)); |
表分析
1 |
skytf=> analyze test_11; |
查看表 test_11 列 id 上的柱状图
1 |
skytf=> select histogram_bounds from pg_stats where tablename='test_11' and attname='id'; |
备注:当default_statistics_target为 1000时,柱状图被分为 1000组。
场景二: attstattarget 100 时的场景
更改表列上的attstattarget参数
1 |
skytf=> alter table test_11 alter column id set STATISTICS 100; |
验证下,attstattarget值已经改成100了
1 |
skytf=> select attrelid,attname,attstattarget from pg_attribute where attrelid=14205208 and attname=('id'); |
表分析,当执行 analyze 命令后,看下结果
1 |
skytf=> analyze test_11; |
再次查看柱状图
1 |
skytf=> select histogram_bounds from pg_stats where tablename='test_11' and attname='id'; |
备注:表”test_11” 的列ID上的 histogram_bounds 已经被分成了100组。
场景三: attstattarget 10 时的场景
更改表列上的attstattarget参数
1 |
skytf=> alter table test_11 alter column id set STATISTICS 10; |
验证下,attstattarget值已经改成10了
1 |
skytf=> select attrelid,attname,attstattarget from pg_attribute where attrelid=14205208 and attname=('id'); |
表分析,当执行 analyze 命令后,看下结果
1 |
skytf=> analyze test_11; |
再次查看柱状图
1 |
skytf=> select histogram_bounds from pg_stats where tablename='test_11' and attname='id'; |
备注:表”test_11” 的列ID上的 histogram_bounds 已经被分成了10 组。
结论
- 列上的柱状图信息可以通过 “alter table set STATISTICS “来更改,并通过视图 pg_attribute.attstattarget来查看列上的当前 statistics 值。
-
列上的柱状图被近似均匀的分割成 “pg_attribute.attstattarget” 组。即
当 pg_attribute.attstattarget 值为 1000时,则列上的柱状图分为 1000组,
当 pg_attribute.attstattarget 值为 100时, 则列上的柱状图分为 100组,
当 pg_attribute.attstattarget 值为 10时, 则列上的柱状图分为 10组。 -
列上 STATISTICS 值越高,则柱状图分割的组越多,柱状图信息越详细 ,但做表分析时,所花的时间也稍长。
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/236371.html