Re: [POC] Faster processing at Gather node
Amit Kapila <amit.kapila16@gmail.com>
On Wed, Nov 8, 2017 at 1:02 AM, Andres Freund <andres@anarazel.de> wrote: > Hi, > > On 2017-11-06 10:56:43 +0530, Amit Kapila wrote: >> On Sun, Nov 5, 2017 at 6:54 AM, Andres Freund <andres@anarazel.de> wrote >> > On 2017-11-05 01:05:59 +0100, Robert Haas wrote: >> >> skip-gather-project-v1.patch does what it says on the tin. I still >> >> don't have a test case for this, and I didn't find that it helped very >> >> much, >> >> I am also wondering in which case it can help and I can't think of the >> case. > > I'm confused? Isn't it fairly obvious that unnecessarily projecting > at the gather node is wasteful? Obviously depending on the query you'll > see smaller / bigger gains, but that there's beenfdits should be fairly obvious? > > I agree that there could be benefits depending on the statement. I initially thought that we are kind of re-evaluating the expressions in target list as part of projection even if worker backend has already done that, but that was not the case and instead, we are deforming the tuples sent by workers. Now, I think as a general principle it is a good idea to delay the deforming as much as possible. About the patch, /* - * Initialize result tuple type and projection info. - */ - ExecAssignResultTypeFromTL(&gatherstate->ps); - ExecAssignProjectionInfo(&gatherstate->ps, NULL); - - /* * Initialize funnel slot to same tuple descriptor as outer plan. */ if (!ExecContextForcesOids(&gatherstate->ps, &hasoid)) @@ -115,6 +109,12 @@ ExecInitGather(Gather *node, EState *estate, int eflags) tupDesc = ExecTypeFromTL(outerNode->targetlist, hasoid); ExecSetSlotDescriptor(gatherstate->funnel_slot, tupDesc); + /* + * Initialize result tuple type and projection info. + */ + ExecAssignResultTypeFromTL(&gatherstate->ps); + ExecConditionalAssignProjectionInfo(&gatherstate->ps, tupDesc, OUTER_VAR); + This change looks suspicious to me. I think here we can't use the tupDesc constructed from targetlist. One problem, I could see is that the check for hasOid setting in tlist_matches_tupdesc won't give the correct answer. In case of the scan, we use the tuple descriptor stored in relation descriptor which will allow us to take the right decision in tlist_matches_tupdesc. If you try the statement CREATE TABLE as_select1 AS SELECT * FROM pg_class WHERE relkind = 'r'; in force_parallel_mode=regress, then you can reproduce the problem I am trying to highlight. -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com
Commits
-
C comment: fix wording about shared memory message queue
- bc0021ef09ec 11.0 landed
-
shm_mq: Have the receiver set the sender's less frequently.
- 497171d3e2aa 11.0 landed
-
shm_mq: Reduce spinlock usage.
- 34db06ef9a1d 11.0 landed
-
Remove use of byte-masking macros in record_image_cmp
- 0b5e33f667a2 11.0 cited
-
Remove memory leak protection from Gather and Gather Merge nodes.
- 9f4992e2a993 11.0 landed
-
Avoid projecting tuples unnecessarily in Gather and Gather Merge.
- b10967eddf96 11.0 landed
-
Tweak use of ExecContextForcesOids by Gather (Merge).
- 0510421ee091 11.0 landed
-
Pass eflags down to parallel workers.
- f455e1125e25 11.0 landed
-
Disable installcheck tests for test_session_hooks
- 745948422c79 11.0 cited
-
First-draft release notes for 10.1.
- 42de8a0255c2 11.0 cited
-
Remove TupleDesc remapping logic from tqueue.c.
- 6b65a7fe62e1 11.0 cited
-
Avoid memory leaks when a GatherMerge node is rescanned.
- 2d44c58c79ae 11.0 cited
-
Code review for nodeGatherMerge.c.
- 04e9678614ec 11.0 cited
-
Add a Gather Merge executor node.
- 355d3993c53e 10.0 cited
-
Push scan/join target list beneath Gather when possible.
- 992b5ba30dca 9.6.0 cited