From: | "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com> |
---|---|
To: | David Rowley <david(dot)rowley(at)2ndquadrant(dot)com> |
Cc: | Dave Vitek <dvitek(at)grammatech(dot)com>, pgsql-general <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: query planner placement of sort/limit w.r.t. joins |
Date: | 2017-04-28 23:37:00 |
Message-ID: | CAKFQuwadCS19d68bO+U0B5x7zqAHJVoj8szVVgujCKcwhYLJmA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Fri, Apr 28, 2017 at 3:24 PM, David Rowley <david(dot)rowley(at)2ndquadrant(dot)com>
wrote:
> On 29 April 2017 at 07:59, Dave Vitek <dvitek(at)grammatech(dot)com> wrote:
> > Is what I want in the query planner's vocabulary? It would need to
> exploit
> > the fact that the _id columns are not nullable, and either exploit the
> > uniqueness of the id columns or do an extra LIMIT step after the join. I
> > think I want it to effectively give the same result I expect (haven't
> > tested) it would give for:
>
> Unfortunately, it's not a plan that the current planner will consider.
>
> > SELECT D.val, B.val, C.val FROM
> > (SELECT * FROM A ORDER BY A.rank LIMIT 100) AS D
> > JOIN B ON D.b_id = B.id
> > JOIN C ON B.c_id = C.id
> > LIMIT 100;
> >
> > Perhaps there are reasons why this optimization is not safe that I
> haven't
> > thought about?
>
> Yeah, I think so. What happens if an A row cannot find a match in B or
> C? This version of the query will end up returning fewer rows due to
> that, but the original version would consider other rows with a higher
> rank.
>
> We've danced around a bit with using foreign keys as proofs that rows
> will exist for other optimisations in the past, but it's tricky ground
> since foreign keys are not updated immediately, so there are windows
> where they may not actually hold true to their word.
>
I read this query as having a relation cardinality of one-to-one
mandatory - which precludes the scenario described.
Is the above saying that, today, there is no planning benefit to setting up
two deferrable references constraints to enforce the non-optional
requirement?
I know I'm guilty of not enforcing the non-optional part of the
constraint. Mostly due to not really realizing it but also having to deal
the added syntax to perform inserts. ORMs I suspect generally would be
unaccommodating here as well...
David J.
From | Date | Subject | |
---|---|---|---|
Next Message | Tomas Vondra | 2017-04-29 00:41:19 | Re: Questionaire: Common WAL write rates on busy servers. |
Previous Message | Diego Augusto Molina | 2017-04-28 23:08:18 | Reset privileges to builtin defaults |