Trong PostgreSQL, mọi bảng là một đối tượng, sử dụng pg_relation_size (‘object_name’) sẽ cung cấp kích thước của đối tượng. Nếu bạn gửi bảng phân vùng ở vị trí của ‘object_name’, nó chỉ cung cấp kích thước đối tượng đó chứ không cung cấp kích thước của các bảng con.
Hãy xem ví dụ dưới đây.
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 () trên bảng mẹ sẽ không cung cấp kích thước chính xác.
postgres=# select pg_size_pretty(pg_relation_size('parent'));
pg_size_pretty
----------------
0 bytes
(1 row)
Để đạt được kích thước bảng phân vùng, trước hết phải biết các bảng con liên quan và kích thước của nó. Sử dụng bảng danh mục pg_inherits sẽ giúp lấy thông tin của các bảng con có kích thước và sau đó tổng hợp chúng lại để có kích thước chính xác. Tôi đã thử viết một hàm nhỏ bằng pg_inherits để hoàn thành nó.
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;
Bây giờ, hãy gửi bảng phân vùng tới hàm.
postgres=# select pg_partition_table_size('parent');
pg_partition_table_size
-------------------------
16384
(1 row)
Nó không hữu ích. Hãy đăng bình luận của bạn, chúng sẽ được đánh giá rất cao.