Re: select is fast, update based on same where clause is slow

From: Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com>
To: Jeff Barrett <jbarrett(at)familynetwork(dot)com>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: select is fast, update based on same where clause is slow
Date: 2001-09-21 15:34:00
Message-ID: Pine.BSF.4.21.0109210830550.88512-100000@megazone23.bigpanda.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

On Fri, 21 Sep 2001, Jeff Barrett wrote:

> I have a select statement that returns a set of 74,000+ results back in
> under a minute as follows:
>
> select s.sessid, s.membid, s.datetime
> from sessions2 s, (select min(datetime) as datetime, membid
> from sessions2
> where membid is not null
> group by membid) as minsess
> where s.membid = minsess.membid
> and s.datetime = minsess.datetime;
>
> The final cost from explain for the above select is 22199.15 ... 24318.40
> with rows = 5 and width = 28.
>
> Then I issue an update as follows (to update those 74,000+ rows):
> update sessions2 set sinceinception = 0
> from sessions2 s, (select min(datetime) as datetime, membid from sessions2
> group by membid) as mindate
> where s.membid = mindate.membid
> and s.datetime = mindate.datetime;
>
> The final cost from explain for the above update is 31112.11...98869.91 with
> rows = 2013209 and width=87.
>
> This update statement has been left running over night and does not
> complete. The ram usage on the machine is at about 3/4 capacity (800mb)
> during this time and CPU usage is near 100%. The machine has the -F option
> set and memory segments of 200mb and is running 7.1.2.
>
> What could be causing this update statement to not complete?
> Why are the costs so different since it seems to me that besides the cost of
> the update they are the same query?

I thought that the updated table is always in your from list (implicitly),
so you'd want:
update sessions2 set sinceinception = 0
from (select min(datetime) as datetime, membid from sessions2 group by
membid) as mindate
where sessions2.membid=mindate.membid and
sessions2.datetime=mindate.datetime;

I think your query would be joining the s/mindate results against
sessions2.

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Josh Berkus 2001-09-21 16:21:45 Re: select is fast, update based on same where clause is slow
Previous Message Jeff Barrett 2001-09-21 14:44:09 select is fast, update based on same where clause is slow