10.PG的统计信息

发布时间 2023-12-24 15:49:17作者: 太白金星有点烦

1.PG的统计信息

  数据的统计信息反映的是数据的分布情况,PG执行SQL语句会经过解析的过程和查询优化过程。

  • 解析过程:解析器将sql语句分解成数据结构并传递给后续步骤
  • 查询优化过程:查询优化器发现执行sql语句的最佳方案,并生产执行计划。
  • 查询优化器sql决定sql语句如何执行依赖于数据库的统计信息,因此,数据库的统计信息对于sql语句的优化来说是非常重要的。

2.查看数据库的统计信息 

  在pg中主要用两个系统表存储数据库的统计信息

  • pg_class:用于记录表和索引的行数、块数等统计信息
  • pg_statistic:用于记录由analyze命令创建的统计信息,这些统计信息由查询优化器使用。
  • 由于pg_statistic记录的数据不易阅读,可以使用pg_statis来查看

3.示例

postgres=# select * from test1;
 tid | tname 
-----+-------
   1 | l1
   2 | l2
   3 | l3
(3 rows)
# 查看该表的行数以及占用的pages,此时看到reltuples和relpages显示的都是0,但是上面查询是有3条数据,所以这个pg_class统计不正确
postgres=# select oid,relname,relpages,reltuples from pg_class where relname='test1';
  oid  | relname | relpages | reltuples 
-------+---------+----------+-----------
 16397 | test1   |        0 |         0

postgres=# select * from pg_stats where  tablename='test1';

使用analyze命令统计信息

postgres=# analyze  verbose test1;
INFO:  analyzing "public.test1"
INFO:  "test1": scanned 1 of 1 pages, containing 3 live rows and 0 dead rows; 3 rows in sample, 3 estimated total rows
ANALYZE
postgres=# 
postgres=# 
postgres=# select oid,relname,relpages,reltuples from pg_class where relname='test1';
-[ RECORD 1 ]----
oid       | 16397
relname   | test1
relpages  | 1
reltuples | 3       #这里看到已经有3条数据了,此时说明这张表的统计信息准确了。

此时查看pg_stats表

postgres=# select tablename as "表名",attname as "列表",avg_width as "平均长度",null_frac as "空值率",n_distinct as "去重后值的个数" from pg_stats where tablename='test1';
 表名   |  列表  |  平均长度 |  空值率 |   去重后率 
-------+-------+----------+--------+----------------
 test1 | tid   |        4 |      0 |             -1
 test1 | tname |        3 |      0 |             -1