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中出現一次,那麼就算掃描一次。
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的對應關系:
小結:
希望能幫助到大家,還不了解就要打屁屁了。