Re: Partitioned tables and relfilenode

From: Amit Langote <Langote_Amit_f8(at)lab(dot)ntt(dot)co(dot)jp>
To: Robert Haas <robertmhaas(at)gmail(dot)com>
Cc: Ashutosh Bapat <ashutosh(dot)bapat(at)enterprisedb(dot)com>, Michael Paquier <michael(dot)paquier(at)gmail(dot)com>, Simon Riggs <simon(at)2ndquadrant(dot)com>, Pg Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Partitioned tables and relfilenode
Date: 2017-03-21 09:05:42
Message-ID: 6837c359-45c4-8044-34d1-736756335a15@lab.ntt.co.jp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 2017/03/21 1:16, Robert Haas wrote:
> On Fri, Mar 17, 2017 at 4:57 AM, Amit Langote
> <Langote_Amit_f8(at)lab(dot)ntt(dot)co(dot)jp> wrote:
>>> Yes, but on the flip side, you're having to add code in a lot of
>>> places -- I think I counted 7 -- where you turn around and ignore
>>> those AppendRelInfos.
>>
>> Perhaps you were looking at the previous version with "minimal" appinfos
>> containing the child_is_partitioned field?
>
> Yes, I think I was. I think this version looks a lot better.

Just to clarify, I assume you reviewed the latest version which does not
create AppendRelInfos, but instead creates PartitionedChildRelInfos (as
also evident from your comments below). Sorry about the confusion.

> /*
> + * Close the root partitioned rel if we opened it above, but keep the
> + * lock.
> + */
> + if (rel != mtstate->resultRelInfo->ri_RelationDesc)
> + heap_close(rel, NoLock);
>
> We didn't take a lock above, though, so drop everything in the comment
> from "but" onward.

Oh, right.

> - add_paths_to_append_rel(root, rel, live_childrels);
> + add_paths_to_append_rel(root, rel, live_childrels, partitioned_rels);
>
> I think it would make more sense to put the new logic into
> add_paths_to_append_rel, instead of passing this down as an additional
> parameter.

OK, done.

> + * do not appear anywhere else in the plan. Situation is exactly the
>
> The situation is...

Fixed.

>
> + if (parent_rte->relkind == RELKIND_PARTITIONED_TABLE)
> + {
> + foreach(lc, root->pcinfo_list)
> + {
> + PartitionedChildRelInfo *pc = lfirst(lc);
> +
> + if (pc->parent_relid == parentRTindex)
> + {
> + partitioned_rels = pc->child_rels;
> + break;
> + }
> + }
> + }
>
> You seem to have a few copies of this logic. I think it would be
> worth factoring it out into a separate function.

OK, done. Put the definition in in planner.c

> + root->glob->nonleafResultRelations =
> + list_concat(root->glob->nonleafResultRelations,
> + list_copy(splan->partitioned_rels));
>
> Please add a brief comment. One line is fine.

Done.

>
> + newrc->isParent = childrte->relkind == RELKIND_PARTITIONED_TABLE;
>
> I'm not sure what project style is, but I personally find these kinds
> of assignments easier to read with an extra set of parantheses:
>
> newrc->isParent = (childrte->relkind == RELKIND_PARTITIONED_TABLE);

Ah, done.

>
> + if (partitioned_rels == NIL)
> + return;
> +
> + foreach(lc, partitioned_rels)
>
> I think the if-test is pointless; the foreach loop is going to start
> by comparing the initial value with NIL.

Right, fixed.

> Why doesn't ExecSerializePlan() need to transfer a proper value for
> nonleafResultRelations to workers? Seems like it should.

It doesn't transfer resultRelations either, presumably because workers do
not handle result relations yet. Also, both resultRelations and
nonleafResultRelations are set *only* if there is a ModifyTable node.

Attached updated patches.

Thanks,
Amit

Attachment Content-Type Size
0001-Avoid-creating-scan-nodes-for-partitioned-tables.patch text/x-diff 66.1 KB
0002-Do-not-allocate-storage-for-partitioned-tables.patch text/x-diff 3.1 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Etsuro Fujita 2017-03-21 09:38:40 Re: postgres_fdw: support parameterized foreign joins
Previous Message Kyotaro HORIGUCHI 2017-03-21 09:00:24 Re: extended statistics: n-distinct