In PostgreSQL is elke tabel een object, het gebruik van pg_relation_size(‘object_name’) geeft de grootte van het object. Als u de partitietabel verzendt in de plaats van 'object_name', geeft deze alleen die objectgrootte, maar niet de grootte van onderliggende tabellen.
Bekijk het onderstaande voorbeeld.
postgres=# dt+
List of relations
Schema | Name | Type | Owner | Size | Description
--------+---------------+-------+----------+------------+-------------
public | child1 | table | postgres | 8192 bytes |
public | child2 | table | postgres | 8192 bytes |
public | parent | table | postgres | 0 bytes |
(3 rows)
pg_relation_size() in de bovenliggende tabel geeft niet de exacte grootte.
postgres=# select pg_size_pretty(pg_relation_size('parent'));
pg_size_pretty
----------------
0 bytes
(1 row)
Om de grootte van de partitietabel te bereiken, moet u eerst de betrokken onderliggende tabellen en de grootte ervan kennen. Het gebruik van de pg_inherits-catalogustabel zal helpen bij het verkrijgen van informatie over onderliggende tabellen met maten en deze later optellen voor de exacte grootte. Ik heb geprobeerd een kleine functie te schrijven met pg_inherits om het voor elkaar te krijgen.
CREATE OR REPLACE FUNCTION pg_partition_table_size(text) returns numeric as
$$
select sum(to_number(pg_size_pretty(pg_relation_size(inhrelid::regclass)),'999999999')) from pg_inherits where inhparent=$1::regclass;
$$ language sql;
Stuur nu de partitietabel naar de functie.
postgres=# select pg_partition_table_size('parent');
pg_partition_table_size
-------------------------
16384
(1 row)
Is het niet handig. Plaats uw opmerkingen, ze zullen zeer op prijs worden gesteld.