Re: Speeding up a query
От | Moray McConnachie |
---|---|
Тема | Re: Speeding up a query |
Дата | |
Msg-id | 007d01bfa151$0a23bb40$01c8a8c0@malthouse.private.net обсуждение исходный текст |
Ответ на | Speeding up a query (Andrew Perrin - Demography <aperrin@demog.berkeley.edu>) |
Список | pgsql-sql |
----- Original Message ----- From: Andrew Perrin - Demography <aperrin@demog.berkeley.edu> To: <pgsql-sql@postgresql.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.
В списке pgsql-sql по дате отправления: