天天看点

PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读

postgresql 几个统计信息的解释难以理解,所以本文花一些时间从源码的角度来解释一下。

让大家对这几个容易误解的统计值有更好的理解。

比较难理解的几个统计值为:

pg_stat_all_indexes 的

pg_statio_all_indexes 的

pg_stat_all_tables 的

pg_statio_all_tables 的

首先需要获得以上统计字段的信息来源:

以上几个统计字段的统计信息来自如下函数:

这些sql函数对应的c函数如下:

以上5个c函数的源码分析

他们都是返回以下数据结构中的某项计数器的值:

这些值是由pgstats进程来进行统计的

tabmsg->t_counts.? 则是通过如下macro进行改写的:

取出每个macro对应的调用以及解释如下:

pgstat_count_index_scan(idx_oid)

统计指定索引的扫描次数,和扫描多少条记录无关,和node有个,一般看执行计划中,同一个索引如果在node中出现一次,那么就算扫描一次。

PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读
PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读

pgstat_count_index_tuples(rel, n)

统计从指定索引获取tid的条数

PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读

pgstat_count_heap_fetch

统计从使用指定索引的tid获取heap tuple的条数

PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读

pgstat_count_buffer_read

统计所有的buffer read次数, 包括在postgresql shared buffers中命中的,或者未在postgresql shared buffers中命中的。

PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读

pgstat_count_buffer_hit(rel)

统计在shared buffers中命中的buffer read次数。

PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读
PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读

pgstat_count_heap_scan(rel)

统计指定表的,全表扫描的次数,和返回的记录数无关,只和执行计划中的node相关,如果在plan中某个表只有一个seq scan的次数,则这条sql执行一次时算一次。

PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读

pgstat_count_heap_getnext(rel)

指从全表扫描节点中扫描的记录数

PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读
PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读

梳理一下最初的统计字段和这些macro的对应关系:

小结:

希望能帮助到大家,还不理解就要打屁屁了。