X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id F40FF5678F for ; Wed, 23 Mar 2005 00:07:08 +0000 (GMT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 35039-02 for ; Wed, 23 Mar 2005 00:07:06 +0000 (GMT) Received: from mx5.net.nih.gov (mailfwd.nih.gov [165.112.130.36]) by svr1.postgresql.org (Postfix) with ESMTP id 68B1556784 for ; Wed, 23 Mar 2005 00:07:05 +0000 (GMT) Received: from mx5.net.nih.gov (localhost [127.0.0.1]) by mx5.net.nih.gov (8.12.10/8.11.6) with ESMTP id j2N077as010189 for ; Tue, 22 Mar 2005 19:07:08 -0500 Received: from WATSON (vpn-165-112-10-102.net.nih.gov [165.112.10.102]) by mx5.net.nih.gov (8.12.10/8.11.6) with SMTP id j2N073Ke010172; Tue, 22 Mar 2005 19:07:07 -0500 Message-ID: <000a01c52f3c$3ee7a980$1f6df345@WATSON> From: "Sean Davis" To: "Richard Huxton" Cc: "PostgreSQL SQL" References: <0af8c6d3baaf3d4a6d918df294019507@mail.nih.gov> <7e154914b76fb1a7c55912b621400860@mail.nih.gov> <4240874E.2080301@archonet.com> Subject: Re: Self-referencing table question Date: Tue, 22 Mar 2005 19:07:04 -0500 MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=response Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.2180 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.124 tagged_above=0 required=5 tests=AWL X-Spam-Level: X-Archive-Number: 200503/307 X-Sequence-Number: 20786 ----- Original Message ----- From: "Richard Huxton" To: "Sean Davis" Cc: "PostgreSQL SQL" Sent: Tuesday, March 22, 2005 3:59 PM Subject: Re: [SQL] Self-referencing table question > Sean Davis wrote: >> I answer my own question, if only for my own records. The following >> query is about 5-6 times faster than the original. Of course, if anyone >> else has other ideas, I'd be happy to hear them. >> >> Sean >> >> explain analyze select from_id,to_id,val from exprsdb.correlation where >> from_id in (select to_id from exprsdb.correlation where from_id=2424 >> order by val desc limit 100) and to_id in (select to_id from >> exprsdb.correlation where from_id=2424 order by val desc limit 100) and >> val>0.6 and to_id > Might not be any faster, but you can do this as a self-join with subquery: > > SELECT c1.from_id, c1.to_id, c1.val > FROM > correlation c1, > ( > SELECT to_id FROM correlation WHERE from_id=2424 > ORDER BY val DESC LIMIT 100 > ) AS c2 > ( > SELECT to_id FROM correlation WHERE from_id=2424 > ORDER BY val DESC LIMIT 100 > ) AS c3 > WHERE > c1.from_id = c2.to_id > AND c1.to_id = c3.to_id > AND c1.val > 0.5 > AND c1.to_id < from_id > ; > > I think PG should be smart enough nowadays to figure out these two queries > are basically the same. Richard, In another email, I posted what I did (which was what you suggest), along with explain analyze output. It looks like the subquery is 4-6 times faster, which is getting into the acceptible for my little web application. Thanks for the help. Sean