X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [64.117.224.130]) by svr1.postgresql.org (Postfix) with ESMTP id 706FCD1B561 for ; Wed, 13 Aug 2003 18:39:51 +0000 (GMT) Received: from svr1.postgresql.org ([64.117.224.193]) by localhost (neptune.hub.org [64.117.224.130]) (amavisd-new, port 10024) with ESMTP id 54817-09 for ; Wed, 13 Aug 2003 15:38:15 -0300 (ADT) Received: from megazone.bigpanda.com (45.mufb.snfc.sffca01r18.dsl.att.net [12.103.249.45]) by svr1.postgresql.org (Postfix) with ESMTP id 1DE29D1B53A for ; Wed, 13 Aug 2003 15:39:40 -0300 (ADT) Received: by megazone.bigpanda.com (Postfix, from userid 1001) id 92302D60D; Wed, 13 Aug 2003 11:39:39 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by megazone.bigpanda.com (Postfix) with ESMTP id 81D2D5C0C; Wed, 13 Aug 2003 11:39:39 -0700 (PDT) Date: Wed, 13 Aug 2003 11:39:39 -0700 (PDT) From: Stephan Szabo To: ProgHome Cc: 'Franco Bruno Borghesi' , Subject: Re: How to optimize this query ? In-Reply-To: <001e01c361c8$c55a78a0$0700a8c0@Office3> Message-ID: <20030813113719.G53899-100000@megazone.bigpanda.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200308/149 X-Sequence-Number: 14765 On Wed, 13 Aug 2003, ProgHome wrote: > select member.id, automated.delivery, member.email > > from (automated INNER JOIN member ON member.id = automated.member_id) > > where activated=1 > and website='$SITE_NAME' > and (select count(*) from trans_member where > (unix_timestamp(now())-unix_timestamp(date)) < > (unix_timestamp(now())-'$today_midnight') and type='purchase' and > comment LIKE '%automated%' > and member_id=member.id and comment LIKE '%$type%') < max_$field > and balance_in_points > $price > and credit_ratings_t$n LIKE '%$lead[borrower_credit_rating]%' > and states LIKE '%$lead[prop_state]%' > and ltv_t$n/100 >= (cast($lead[loan_amount] as unsigned) / > cast($lead[current_value] as unsigned)) > and amount_t$n < $lead[loan_amount] > > AND $id NOT IN (select lead_id from purchase where > member_id=member.id) > AND $aff_id NOT IN (select affiliate_locked_id from affiliate_lockout > where member_id=member.id) > AND $id NOT IN (select lead_id from purchase where member_id IN > (select member_id_to_exclude from member_exclusion where > member_id=member.id)) In these cases I'd suggest trying a NOT EXISTS, maybe something like (for the first one): AND NOT EXISTS (select 1 from purchase where member_id=member.id AND lead_id=$id) With a two column index on purchase(member_id,lead_id) [or lead_id, member_id maybe] you might be able to do okay.