Hi Tom, thank you very much. I'll load these tables onto a 9.2 instance and
report back.

Matt

On Fri, Sep 28, 2012 at 2:44 PM, Tom Lane <t...@sss.pgh.pa.us> wrote:

> Matt Daw <m...@shotgunsoftware.com> writes:
> > Howdy, I've been debugging a client's slow query today and I'm curious
> > about the query plan. It's picking a plan that hashes lots of rows from
> the
> > versions table (on v9.0.10)...
>
> > EXPLAIN ANALYZE
> > SELECT COUNT(*) FROM notes a WHERE
> > a.project_id = 114 AND
> > EXISTS (
> >     SELECT 1 FROM note_links b
> >     WHERE
> >     b.note_id = a.id AND
> >     b.entity_type = 'Version' AND
> >     EXISTS (
> >         SELECT 1 FROM versions c
> >         WHERE
> >         c.id = b.entity_id AND
> >         c.code ILIKE '%comp%' AND
> >         c.retirement_date IS NULL
> >     ) AND
> >     b.retirement_date IS NULL
> > )
>
> I think the real problem here is that 9.0 is incapable of avoiding a
> full table scan on "note_links", which means it doesn't really have any
> better option than to do the inner EXISTS as a full-table semijoin.
> This is because it can't push a.id down through two levels of join, and
> because the semijoins don't commute, there's no way to get a.id into the
> scan of note_links to pull out only the useful rows.  The hack with
> LIMIT avoids this problem by preventing the inner EXISTS from being
> treated as a full-fledged semijoin; but of course that hack leaves you
> vulnerable to very bad plans if the statistics are such that a nestloop
> join isn't the best bet for the inner EXISTS.
>
> The work I did for parameterized paths in 9.2 was intended to address
> exactly this type of scenario.  I would be interested to know if 9.2
> does this any better for you.
>
>                         regards, tom lane
>

Reply via email to