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 |
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 |