统计数据

优化器为了得到优化的查询执行计划,需要使用到表的统计信息。这一节我们给出优化器使用到的 统计数据。

优化器使用的一种统计数据是表的元组数(reltuples)和磁盘页数(relpages)。这些信息存放在pg_class系统表中。

例如,下面的SQL给出了lineitem的reltuples和relpages。效率原因,reltuples和relpages并不会实时更新。它们会在用户执行Analyze时的时候更新。

1
2
3
4
5
postgres=# SELECT relname, relkind, reltuples, relpages FROM pg_class WHERE relname = 'lineitem';
 relname  | relkind |  reltuples  | relpages
----------+---------+-------------+----------
 lineitem | r       | 6.00122e+06 |    29911
(1 row)

大部分查询会有一些where条件,用于从一个表中选择出部分满足条件的元组。优化器需要估计选择谓词的选择率(selectivity),即where条件中满足条件的元组比例。用于估计选择率的统计信 息存放在pg_statistic系统表中。pg_statistic系统表在用户使用Analyze时更新。

OushuDB有一个pg_statistics的视图pg_stats来帮助用户更容易的查看一个表的统计数据。例如下面的语句可以查看lineitem表的相关统计数据。

1
postgres=# SELECT * FROM pg_stats  WHERE tablename = 'lineitem';

pg_statistics中存放的信息由ANALYZE语句收集。其中most_common_vals和histogram_bounds条目数由default_statistics_target确定。default_statistics_target参数可以在列级别设置,也可以设置一个全局值,默认值为25。用户可以调整该值的大小来改变统计数据收集的精确性。default_statistics_target值越大,收集的统计信息越精确,但是ANALYZE语句运行的时间会越长。

1
2
3
4
5
# 设置一个列的statistics target值
alter table <table_name> alter column <column_name> set statistics < value from 1 to 1000 > ;

# 恢复使用default_statistics_target
alter table <table_name> alter column <column_name> set statistics