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中出现一次,那么就算扫描一次。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuUDOmF2Y2gDNycTO1MmNzAzY1MDN1kDN4UTMxMDOwUDZiNDM0UTNkZzLcNXZslmZxl3Lc12bj5ycj5Wd5lGbh5ycz92Lc9CX6MHc0RHaiojIsJye.png)
pgstat_count_index_tuples(rel, n)
统计从指定索引获取tid的条数
pgstat_count_heap_fetch
统计从使用指定索引的tid获取heap tuple的条数
pgstat_count_buffer_read
统计所有的buffer read次数, 包括在postgresql shared buffers中命中的,或者未在postgresql shared buffers中命中的。
pgstat_count_buffer_hit(rel)
统计在shared buffers中命中的buffer read次数。
pgstat_count_heap_scan(rel)
统计指定表的,全表扫描的次数,和返回的记录数无关,只和执行计划中的node相关,如果在plan中某个表只有一个seq scan的次数,则这条sql执行一次时算一次。
pgstat_count_heap_getnext(rel)
指从全表扫描节点中扫描的记录数
梳理一下最初的统计字段和这些macro的对应关系:
小结:
希望能帮助到大家,还不理解就要打屁屁了。