PG如何通過元命令獲取表文件大小?
有三種方式,下面依次介紹。
1、通過元命令獲取表文件大小
通過dt+可以得到該表大小。該元命令會轉換成SQL語句去執行,實際上是通過pg_table_size函數進行獲取。該函數調用calulate_table_size(rel)其中rel為表的描述結構Relation。通過這個方式計算表大小包括fsm、vm文件大小,如果有toast索引,還包括toast表大小。那么具體獲取文件大小的方式是什么呢?看calculate_relation_size函數:最終通過stat函數來獲取,這個得到的是文件大小,而不是占用磁盤大小。同樣,對于toast索引也是通過這種方式計算得到。
2、內部計算表有多少頁
通過RelationGetNumberOfBlocks只計算表主文件的多少頁,調用函數RelationGetNumberOfBlocksInFork進行計算。該函數對于序列、索引或者分區索引,直接通過smgrnblocks->mdnblocks獲得,對于表、toast和物化視圖,調用函數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中統計的多少頁和多少記錄relpages = (BlockNumber) rel->rd_rel->relpages;reltuples = (double) rel->rd_rel->reltuples;//真實頁數少于10,真實記錄少于0,且無子表,那么估算頁數為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;//統計平均每頁多少記錄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);
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
- 1 特斯拉Optimus Gen3量產在即,哪些環節最具確定性?
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實測:中文穩、細節炸,設計師慌了
- 3 AI狂歡遇上油價破百,全球股市還能漲多久? | 產聯看全球
- 4 6000億美元估值錨定:字節跳動的“去單一化”突圍與估值重構
- 5 Tesla AI5芯片最新進展總結
- 6 連夜測了一波DeepSeek-V4,我發現它可能只剩“審美”這個短板了
- 7 熱點丨AI“瑜亮之爭”:既生OpenClaw,何生Hermes?
- 8 2026,人形機器人只贏了面子
- 9 AI界的殺豬盤:9秒刪庫跑路,全員被封號,還繼續扣錢!
- 10 AI Infra產業鏈卡在哪里了?


分享













