天天看點

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的對應關系:

小結:

希望能幫助到大家,還不了解就要打屁屁了。