Received: from localhost (maia-2.hub.org [200.46.204.187]) by postgresql.org (Postfix) with ESMTP id AD03A9FA381 for ; Wed, 6 Dec 2006 16:19:58 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.187]) (amavisd-new, port 10024) with ESMTP id 50513-02 for ; Wed, 6 Dec 2006 16:19:41 -0400 (AST) X-Greylist: from auto-whitelisted by SQLgrey-1.7.4 Received: from myemma.com (db1.e2ma.net [66.179.147.163]) by postgresql.org (Postfix) with ESMTP id B002D9FA380 for ; Wed, 6 Dec 2006 16:19:44 -0400 (AST) Received: from localhost (localhost.localdomain [127.0.0.1]) by myemma.com (Postfix) with ESMTP id 6ABCD23CDA; Wed, 6 Dec 2006 14:19:42 -0600 (CST) Received: from myemma.com ([127.0.0.1]) by localhost (velma [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 18225-03; Wed, 6 Dec 2006 14:19:39 -0600 (CST) Received: from [10.0.23.59] (unknown [209.149.59.218]) by myemma.com (Postfix) with ESMTP id 9FE1F23CD0; Wed, 6 Dec 2006 14:19:38 -0600 (CST) Message-ID: <457725DA.90402@myemma.com> Date: Wed, 06 Dec 2006 14:19:38 -0600 From: Erik Jones User-Agent: Thunderbird 1.5.0.7 (Windows/20060909) MIME-Version: 1.0 To: Rafael Martinez Cc: Ted Allen , Stephan Szabo , pgsql-performance@postgresql.org Subject: Re: Problems with an update-from statement and pg-8.1.4 References: <1165432244.9606.18.camel@bbking.linux> <20061206111630.R8187@megazone.bigpanda.com> <45772022.4050303@blackducksoftware.com> <1165435845.9606.26.camel@bbking.linux> In-Reply-To: <1165435845.9606.26.camel@bbking.linux> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at myemma.com X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200612/147 X-Sequence-Number: 22203 Rafael Martinez wrote: > On Wed, 2006-12-06 at 14:55 -0500, Ted Allen wrote: > >> Stephan Szabo wrote: >> >>> On Wed, 6 Dec 2006, Rafael Martinez wrote: >>> >>>> mailstats=# EXPLAIN update mail SET spamscore = '-5.026' FROM mail m, >>>> mail_received mr where mr.mail_id = m.mail_id AND mr.queue_id = >>>> '1GrxLs-0004N9-I1' and mr.mailhost = '129.240.10.47'; >>>> >>>> >>> I don't think this statement does what you expect. You're ending up with >>> two copies of mail in the above one as "mail" and one as "m". You probably >>> want to remove the mail m in FROM and use mail rather than m in the >>> where clause. >>> >>> >>> >> Worse yet I think your setting "spamcore" for EVERY row in mail to >> '-5.026'. The above solution should fix it though. >> >> -- Ted >> >> > > Thanks for the answers. I think the 'problem' is explain in the > documentation: > > "fromlist > > A list of table expressions, allowing columns from other tables to > appear in the WHERE condition and the update expressions. This is > similar to the list of tables that can be specified in the FROMClause of > a SELECT statement. Note that the target table must not appear in the > fromlist, unless you intend a self-join (in which case it must appear > with an alias in the fromlist)". > > And as you said, we can not have 'mail m' in the FROM clause. I have > contacted the developers and they will change the statement. I gave then > these 2 examples: > > ------------------------------------------------------------------------------- > mailstats=# EXPLAIN update mail SET spamscore = '-5.026' FROM > mail_received mr where mr.mail_id = mail.mail_id AND mr.queue_id = > '1GrxLs-0004N9-I1' and mr.mailhost = '129.240.10.47'; > QUERY PLAN > ------------------------------------------------------------------------------------------------------ > Nested Loop (cost=0.00..6.54 rows=1 width=57) > -> Index Scan using received_queue_id_index on mail_received mr > (cost=0.00..3.20 rows=1 width=4) > Index Cond: ((queue_id)::text = '1GrxLs-0004N9-I1'::text) > Filter: (mailhost = '129.240.10.47'::inet) > -> Index Scan using mail_pkey on mail (cost=0.00..3.32 rows=1 > width=57) > Index Cond: ("outer".mail_id = mail.mail_id) > (6 rows) > > mailstats=# explain update mail SET spamscore = '-5.026' where mail_id > = (select mail_id from mail_received where queue_id = '1GrxLs-0004N9-I1' > and mailhost = '129.240.10.47'); > QUERY PLAN > ----------------------------------------------------------------------------------------------------- > Index Scan using mail_pkey on mail (cost=3.20..6.52 rows=1 width=57) > Index Cond: (mail_id = $0) > InitPlan > -> Index Scan using received_queue_id_index on mail_received > (cost=0.00..3.20 rows=1 width=4) > Index Cond: ((queue_id)::text = '1GrxLs-0004N9-I1'::text) > Filter: (mailhost = '129.240.10.47'::inet) > (6 rows) > ------------------------------------------------------------------------------- > Look again at the estimated costs of those two query plans. You haven't gained anything there. Try this out: EXPLAIN UPDATE mail SET spamscore = '-5.026' FROM mail_received mr WHERE mail.mail_id = mr.mail_id AND mr.queue_id = '1GrxLs-0004N9-I1' ; -- erik jones software development emma(r)