Hi. I used to think that $subject didn't happen, but it actually does and ends up consuming a fixed 8192 bytes on the disk.
create table p (a int[]) partition by list (a); CREATE TABLE select pg_table_size('p'); pg_table_size --------------- 8192 (1 row) select pg_relation_size(c1.oid) as p_size, pg_relation_size(c1.reltoastrelid) as p_toast_heap_size, pg_relation_size(c2.oid) as p_toast_index_size from pg_class c1, pg_class c2, pg_index i where c1.relname = 'p' and c1.reltoastrelid = i.indrelid and c2.oid = i.indexrelid; p_size | p_toast_heap_size | p_toast_index_size --------+-------------------+-------------------- 0 | 0 | 8192 (1 row) I think we should prevent this, a fix for which is implemented by the attached patch. Thanks, Amit
From b84ee9f5aed9519d5976dc1a6c8f501d0122a686 Mon Sep 17 00:00:00 2001 From: amit <amitlangot...@gmail.com> Date: Tue, 16 Jan 2018 19:08:11 +0900 Subject: [PATCH v1] Do not create TOAST table for partitioned tables --- src/backend/catalog/toasting.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c index 0b4b5631a1..5e84f28201 100644 --- a/src/backend/catalog/toasting.c +++ b/src/backend/catalog/toasting.c @@ -393,6 +393,7 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, * (1) there are any toastable attributes, and (2) the maximum length * of a tuple could exceed TOAST_TUPLE_THRESHOLD. (We don't want to * create a toast table for something like "f1 varchar(20)".) + * No need to create a TOAST table for partitioned tables. */ static bool needs_toast_table(Relation rel) @@ -404,6 +405,9 @@ needs_toast_table(Relation rel) int32 tuple_length; int i; + if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + return false; + tupdesc = rel->rd_att; for (i = 0; i < tupdesc->natts; i++) -- 2.11.0