В PostgreSQL всяка таблица е обект, като използването на pg_relation_size(‘object_name’) ще даде размера на обекта. Ако изпратите таблицата на дяловете на мястото на ‘object_name’, тя дава само този размер на обекта, но не и размерите на дъщерните таблици.
Вижте примера, даден по-долу.
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() на родителската таблица няма да даде точния размер.
postgres=# select pg_size_pretty(pg_relation_size('parent'));
pg_size_pretty
----------------
0 bytes
(1 row)
За да постигнете размер на таблицата за дялове, първо познайте съответните дъщерни таблици и нейните размери. Използването на каталожна таблица pg_inherits ще ви помогне да получите информация за дъщерните таблици с размери и по-късно да ги сумирате за точен размер. Опитах се да напиша малка функция, използвайки pg_inherits, за да го направя.
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;
Сега изпратете таблицата на дяловете на функцията.
postgres=# select pg_partition_table_size('parent');
pg_partition_table_size
-------------------------
16384
(1 row)
Не е ли полезно. Публикувайте вашите коментари, те ще бъдат високо оценени.