訂閱
糾錯
加入自媒體

PG如何通過元命令獲取表文件大?

2021-03-05 10:06
yzsDBA
關注

有三種方式,下面依次介紹。

1、通過元命令獲取表文件大小

通過dt+可以得到該表大小。該元命令會轉換成SQL語句去執(zhí)行,實際上是通過pg_table_size函數(shù)進行獲取。該函數(shù)調用calulate_table_size(rel)其中rel為表的描述結構Relation。通過這個方式計算表大小包括fsm、vm文件大小,如果有toast索引,還包括toast表大小。那么具體獲取文件大小的方式是什么呢?看calculate_relation_size函數(shù):最終通過stat函數(shù)來獲取,這個得到的是文件大小,而不是占用磁盤大小。同樣,對于toast索引也是通過這種方式計算得到。

2、內部計算表有多少頁

通過RelationGetNumberOfBlocks只計算表主文件的多少頁,調用函數(shù)RelationGetNumberOfBlocksInFork進行計算。該函數(shù)對于序列、索引或者分區(qū)索引,直接通過smgrnblocks->mdnblocks獲得,對于表、toast和物化視圖,調用函數(shù)table_relation_size計算出文件大小然后除以一頁大小得到多少頁。table_relation_size調用heapam_relation_size->smgrnblocks,和上一個方法不同之處在于是否需要包括fsm、vm在內。

3、內部估算表大小

通過estimate_rel_size->table_relation_estimate_size->heapam_estimate_rel_size估算表有多少頁、多少記錄:

curpages = RelationGetNumberOfBlocks(rel);//真實多少頁//pg_class中統(tǒng)計的多少頁和多少記錄relpages = (BlockNumber) rel->rd_rel->relpages;reltuples = (double) rel->rd_rel->reltuples;//真實頁數(shù)少于10,真實記錄少于0,且無子表,那么估算頁數(shù)為10if (curpages < 10 && reltuples < 0 && !rel->rd_rel->relhassubclass)   curpages= 10;if (curpages == 0){//當前0頁,那么0個記錄   *tuples= 0;}if (reltuples >= 0 && relpages> 0)   density= reltuples / (double) relpages;//統(tǒng)計平均每頁多少記錄else{   tuple_width = get_rel_data_width(rel,attr_widths);   tuple_width += overhead_bytes_per_tuple;   density = usable_bytes_per_page /tuple_width;}*tuples = rint(density * (double) curpages);

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內容
    文章糾錯
    x
    *文字標題:
    *糾錯內容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號