10.PG的统计信息
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