Calculating Postgres table sizes is a bit complicated, due to the variety of data sizes available.
- Table data
main- main data fork of relationfsm- Free Space Map for relationvm- Visibility Map for relationinit- initialization fork (if any) for relation
- TOAST data
- mechanism for managing large data values like text, binary data (BYTEA), and JSON
- Index data
- data required for table search indexes
The following data can be helpful when determining which data points to select.
- Total size on disk (main data, toast, free space/visibility maps, init, and indexes)
pg_total_relation_size(reltoastrelid)
- Primary table size: (main data, toast, free space/visibility maps, init) (not indexes!)
pg_table_size(pg_class.oid)
- Partial table data sizes: (either main, free space, visibility maps, or init)
pg_relation_size(pg_class.oid)pg_relation_size(pg_class.oid, 'fsm')pg_relation_size(pg_class.oid, 'vm')pg_relation_size(pg_class.oid, 'init')
- Table index size
pg_indexes_size(pg_class.oid)
