From: | Josh Berkus <josh(at)agliodbs(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | Pgsql-Performance <pgsql-performance(at)postgresql(dot)org> |
Subject: | Re: Help analyzing 7.2.4 EXPLAIN |
Date: | 2003-04-10 03:39:00 |
Message-ID: | 200304092039.00376.josh@agliodbs.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
Tom,
> Keep in mind that in the subqueries, the "actual time" shown is the time
> per iteration --- you should multiply by the "loops" value to get an
> accurate idea of where the time is going. With that in mind, it's real
> clear that the first subplan is eating the bulk of the time.
Thanks, that's what I thought, but I wanted confirmation.
> The first thing that pops to mind is whether you really need the *first*
> conflict, or would it be enough to find any old conflict? If you could
> dispense with the ORDER BY then at least some evaluations of
> if_addendee_conflict() could be saved.
The problem is that I need the lowest-sorted non-NULL conflict. The majority
(95%) of the runs of if_attendee_conflict will return NULL. But we can't
know that until we run the test, which is a bit too complex for a case
statement.
Now, if I could figure out a way to stop testing for a particular user the
first time if_attendee_conflict returned a particular result, that could cut
the number of subquery loops by 1/3. Any ideas?
> Realistically, though, I think you're going to have to refactor the work
> to make this perform reasonably. How much of what
> if_addendee_conflict() does is actually dependent on the user_id?
Almost all of it. The question being answered by the query is "Please give me
the list of all users, plus which of them have a conflict for that particular
date and time and what kind of conflict it is".
>Could
> you separate out tests that depend only on the event, and do that in a
> separate pass that is done only once per event, instead once per
> event*user? If you could reduce the number of events that need to be
> examined for any given user, you could get somewhere.
Regrettably, no. We have to run it for each user. I was acutally hoping to
come up with a way of running for less events, acutally ....
>
> Also, I don't see where this query checks to see if the user is actually
> interested in attending the event. Is that one of the things
> if_addendee_conflict checks?
No. <grin> the users aren't given a choice about what they want to attend --
the purpose of the query is to supply the calendar staff with a list of who's
available so the users can be assigned -- whether they want to or not.
Well, we'll see if the current incarnation bogs down in a couple of months,
and I'll rework the query if so. Thanks for the advice!
--
Josh Berkus
Aglio Database Solutions
San Francisco
From | Date | Subject | |
---|---|---|---|
Next Message | Josh Berkus | 2003-04-10 03:45:29 | Re: Caching (was Re: choosing the right platform) |
Previous Message | Matthew Nuzum | 2003-04-10 01:16:36 | Caching (was Re: choosing the right platform) |