PG--数据库统计信息

时间:2022-10-03 10:58:39

analyze

自动收集统计信息

自动收集统计信息是依赖AUTOVACUUM定时触发analyze

触发 vacuum analyze的条件

表上(insert,update,delte 记录) >= 
autovacuum_analyze_scale_factor* reltuples(表上记录数)
+ autovacuum_analyze_threshold

这个我在这篇里面写过https://blog.51cto.com/u_13874232/5702603


手动收集统计信息

analyze [verbose] [table[(column[,..])]]

verbose:显示处理的进度,以及表的一些统计信息
table:要分析的表名,如果不指定,则对整个数据库中的所有表作分析
column:要分析的特定字段的名字默认是分析所有字段
analyze 命令 会在表上加读锁

例如

analyze VERBOSE  demotable;
analyze demotable(num);


pg_class

表和索引的行数、页面数记录在系统表pg_class中,是预估值。可以通过analyz来重新收集统计信息

select reltuples ,relpages from pg_class where relname='test';
postgres=# drop table test;
DROP TABLE
postgres=# create table test (id int);
CREATE TABLE
postgres=# insert into test values (generate_series(1,10));
INSERT 0 10
postgres=# select reltuples ,relpages from pg_class where relname='test';
reltuples | relpages
-----------+----------
0 | 0
(1 row)
postgres=# analyze test;
ANALYZE
postgres=# select reltuples ,relpages from pg_class where relname='test';
reltuples | relpages
-----------+----------
10 | 1
(1 row)

pg_stats

postgres=# \d pg_stats
View "pg_catalog.pg_stats"
Column | Default
------------------------+---------
schemaname |---模式名
tablename |---表名
attname |---列名
inherited |---是否是继承列
null_frac |---null空值的比率
avg_width |---平均宽度,字节
n_distinct |---大于零就是非重复值的数量,小于零则是非重复值的个数除以行数
most_common_vals |---高频值
most_common_freqs |---高频值的频率
histogram_bounds |---直方图
correlation |---物理顺序和逻辑顺序的关联性
most_common_elems |---高频元素,比如数组
most_common_elem_freqs |---高频元素的频率
elem_count_histogram |---直方图(元素)
postgres=# select * from pg_stats where tablename = 'test';
-[ RECORD 1 ]----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
schemaname | public
tablename | test
attname | id
inherited | f
null_frac | 0
avg_width | 4
n_distinct | -1
most_common_vals |
most_common_freqs |
histogram_bounds | {2,1004,1945,2951,3935,4904,5864,6882,7944,8991,9967,11026,12062,13119,14101,15059,16028,17091,18116,19005,20121,21154,22095,23067,24046,25032,26045,27032,28000,28978,30002,31001,31938,32963,33996,35000,36029,36982,37853,38780,39847,40867,41818,42842,43864,44909,45933,46872,47847,48777,49678,50709,51723,52644,53604,54688,55644,56614,57631,58710,59784,60796,61786,62746,63797,64790,65807,66756,67799,68802,69758,70755,71873,72815,73883,74879,75922,76976,78057,79014,80088,81020,81982,82954,83979,85008,86015,86961,87903,88860,89871,90933,92005,92983,93921,94905,95952,96964,97986,98943,100000}
correlation | 1
most_common_elems |
most_common_elem_freqs |
elem_count_histogram |

从上可以得到

n_distinct是-1,表示在某一列中的非重复值与总行数相同

null_frac为0,表示没有null值

most_common_vals:MCV,高频值列表,此例因为是顺序插入的,数据分布均匀,所以没有高频值

most_common_freqs:MCF,高频值的频率

histogram_bounds:直方图,表示该字段除了高频值以外值的的柱状图信息,直方图中的数据不包含MCV/MCF的部分,两者的值是补充关系而且不会重合,但不一定互补(两种加起来未必是全部数据),用于将对应列的值划分为多个分组。

correlation:值的物理顺序和逻辑顺序的关联度,-1到1之间,1表示逻辑顺序与存储的物理顺序相同,-1表示逻辑顺序与存储的物理顺序相反


统计信息收集配置

postgres=# select name,setting from pg_settings where name like '%track%';
name | setting
---------------------------+---------
track_activities | on
track_activity_query_size | 1024
track_commit_timestamp | off
track_counts | on
track_functions | none
track_io_timing | off
(6 rows)

• track_activities: 是否收集当前正在执行的SQL,默认为on
• track_counts: 是否收集表和索引上的统计信息,默认为on
• track_functions: 可以取all、pl和none,如果是pl则只收集pl/pgsql写的函数的统计信息;
all表示收集所有类型的函数,包括C语言和SQL写的函数。默认为none
• track_io_timing: 是否收集I/O的时间信息。一般不建议打开,默认为off


统计信息收集进程

统计信息收集进程 stats collector 放入表 pg_stat_all_tables

在运行时放入 统计信息存放位置$PGHOME/pg_stat_tmp

持久化统计信息 $PGHOME/pg_stat(在关闭库的时候会拷贝到这个位置)



常用

pg_backend_pid() 
处理当前会话的服务器进程的进程 ID

select pg_backend_pid();
pg_backend_pid
----------------
32002
(1 row)
pg_stat_reset() 
把用于当前数据库的所有统计计数器重置为零
(默认要求超级用户权限,但这个函数的 EXECUTE 可以被授予给其他人)。

select pg_stat_reset();
\conninfo
\set ECHO_HIDDEN on

其他视图

各个对象级别的统计信息视图:
pg_stat_database
pg_stat_all_tables
pg_stat_sys_tables
pg_stat_user_tables
pg_stat_all_indexes
pg_stat_sys_indexes
pg_stat_user_indexes

各个对象上发生I/O情况的统计视图:
pg_statio_all_tables
pg_statio_sys_tables
pg_statio_user_tables
pg_statio_all_indexes
pg_statio_sys_indexes
pg_statio_user_indexes
pg_statio_all_sequences
pg_statio_sys_sequences
pg_statio_user_sequences