Re: Speeding up a query

From: "Moray McConnachie" <moray(dot)mcconnachie(at)computing-services(dot)oxford(dot)ac(dot)uk>
To: "Andrew Perrin - Demography" <aperrin(at)demog(dot)berkeley(dot)edu>, <pgsql-sql(at)postgresql(dot)org>
Subject: Re: Speeding up a query
Date: 2000-04-08 11:53:21
Message-ID: 007d01bfa151$0a23bb40$01c8a8c0@malthouse.private.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql


----- Original Message -----
From: Andrew Perrin - Demography <aperrin(at)demog(dot)berkeley(dot)edu>
To: <pgsql-sql(at)postgresql(dot)org>
Sent: Friday, April 07, 2000 8:12 PM
Subject: [SQL] Speeding up a query

>
> select last_name from personal_data where id in (
> select distinct id from event_detail, event_universe where
> event_detail.eventtypeid = event_universe.eventtypeid and
> event_universe.studentstatus = 'Student' and
> event_detail.date_effective <= datetime(date('1-jan-1998')))
> and
> id not in (
> select distinct id from event_detail, event_universe where
> event_detail.eventtypeid = event_universe.eventtypeid and
> event_universe.studentstatus = 'NotStudent' and
> event_detail.date_effective <= datetime(date('1-jun-1998')))

Assuming you have indices set up on all appropriate fields, and that you
replace = by LIKE for text fields (don't know if that makes any speed
difference, but it makes it standard SQL), then you need to modify your
query to use EXISTS instead of IN. NOT IN can be particularly slow. You
don't need the DISTINCT's either, I think.

SELECT last_name FROM personal_data WHERE EXISTS (SELECT id FROM
event_detail,event_universe WHERE id=personal_data.id AND
event_detail.eventtypeid=event_universe.eventtypeid AND
event_universe.studentstatus LIKE 'Student' AND
event_detail.date_effective<=datetime(date('1-jan-1998')))
AND NOT EXISTS
(SELECT id FROM event_detail,event_universe WHERE id=personal_data.id AND
event_detail.eventtypeid=event_universe.eventtypeid AND
event_universe.studentstatus LIKE 'NotStudent' AND
event_detail.date_effective<=datetime(date('1-jun-1998')));

Should be right...
M.

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Ed 2000-04-08 20:29:29 Strange message...
Previous Message Moray McConnachie 2000-04-08 11:44:28 Re: SQL syntax for updating tables