统计数据 ---------- 优化器为了得到优化的查询执行计划,需要使用到表的统计信息。这一节我们给出优化器使用到的 统计数据。 优化器使用的一种统计数据是表的元组数(reltuples)和磁盘页数(relpages)。这些信息存放在pg_class系统表中。 例如,下面的SQL给出了lineitem的reltuples和relpages。效率原因,reltuples和relpages并不会实时更新。它们会在用户执行Analyze时的时候更新。 .. code-block:: html :linenos: 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_statistic 的视图 pg_stats 来帮助用户更容易的查看一个表的统计数据。例如下面的语句可以查看 lineitem 表的相关统计数据。 .. code-block:: html :linenos: postgres=# SELECT * FROM pg_stats WHERE tablename = 'lineitem'; pg_statistic中存放的信息由ANALYZE语句收集。其中most_common_vals和histogram_bounds条目数由default_statistics_target确定。default_statistics_target参数可以在列级别设置,也可以设置一个全局值,默认值为25。用户可以调整该值的大小来改变统计数据收集的精确性。default_statistics_target值越大,收集的统计信息越精确,但是ANALYZE语句运行的时间会越长。 .. code-block:: html :linenos: # 设置一个列的statistics target值 alter table alter column set statistics < value from 1 to 1000 > ; # 恢复使用default_statistics_target alter table alter column set statistics