Slightly different approach than you might expect. For larger DBs you'd likely want to exclude base and instead use pg_database_size() in addition.
postgres(2454884) =# create temp table xx(dir text, sz bigint); CREATE TABLE Time: 2.587 ms postgres(2454884) =# copy xx(sz, dir) from program 'du -s *'; COPY 21 Time: 3.793 ms postgres(2454884) =# select * from xx; dir | sz ----------------------+------- base | 26280 global | 568 pg_commit_ts | 12 pg_dynshmem | 4 pg_logical | 16 pg_multixact | 28 pg_notify | 4 pg_replslot | 4 pg_serial | 4 pg_snapshots | 4 pg_stat | 4 pg_stat_tmp | 4 pg_subtrans | 12 pg_tblspc | 4 pg_twophase | 4 PG_VERSION | 4 pg_wal | 16392 pg_xact | 12 postgresql.auto.conf | 4 postmaster.opts | 4 postmaster.pid | 4 (21 rows) Time: 0.282 ms On Mon, Jul 15, 2024 at 4:42 PM Shenavai, Manuel <manuel.shena...@sap.com> wrote: > Hi everyone, > > > > we currently capture the db size (pg_database_size) which gives the “Disk > space used by the database with the specified name”. Is it possible to > further split this data how much space is occupied by live tuples, dead > tuples and free space? > > > > We would like to have something like: > > DB Size: 200 MB, live tuple 100MB, Dead Tuple: 20 MB, free space 80MB > > > > Is this possible? > > > > Best regards, > > Manuel >