Received: from maia.hub.org (maia-5.hub.org [200.46.204.29]) by mail.postgresql.org (Postfix) with ESMTP id 0602B632890 for ; Thu, 26 Aug 2010 02:24:30 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.29]) (amavisd-maia, port 10024) with ESMTP id 74492-10 for ; Thu, 26 Aug 2010 05:24:23 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.17.10]) by mail.postgresql.org (Postfix) with ESMTP id D0FBE63277E for ; Thu, 26 Aug 2010 02:24:22 -0300 (ADT) Received: from webserv.wug.de ([194.25.154.138]) by mrelayeu.kundenserver.de (node=mreu0) with ESMTP (Nemesis) id 0LZjFg-1PFotN0pWW-00lSXM; Thu, 26 Aug 2010 07:24:21 +0200 Received: from kretschmer by webserv.wug.de with local (Exim 3.36 #1) id 1OoUwm-00070U-00 for pgsql-performance@postgresql.org; Thu, 26 Aug 2010 07:24:20 +0200 Date: Thu, 26 Aug 2010 07:24:20 +0200 From: "A. Kretschmer" To: pgsql-performance@postgresql.org Subject: Re: SubQuery Performance Message-ID: <20100826052419.GB25058@a-kretschmer.de> References: <6107e604-2694-4a32-b625-d9870a4c0df3@y11g2000yqm.googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6107e604-2694-4a32-b625-d9870a4c0df3@y11g2000yqm.googlegroups.com> X-OS: Debian/GNU Linux - weil ich es mir Wert bin! User-Agent: Mutt/1.5.9i X-Provags-ID: V02:K0:j4DmtI56+FX2UFkApUSqN4VkhE9s7jjs6EUptLKksse gAM+nZGfQ/9qX56Hukx/G2t1p4WjS59y+8sj5EJlKSMBQ+75/+ MG+Sa9eE5ZzhoAUIUWvjr1Nl3A3LMpRVduABvyB6NJBUDZ+2Et GAJ+I7EcRkorBcYRiBtIQToODJzv8blrOFCrPKl2qQKq9Hf3jB IsOd8lTIhBFoDdjTfBQyA== X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=-1.89 tagged_above=-10 required=5 tests=BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, T_FRT_CONTACT=0.01 X-Spam-Level: X-Archive-Number: 201008/281 X-Sequence-Number: 40124 In response to mike : > Hi All, > > I have a poor performance SQL as following. The table has about 200M > records, each employee have average 100 records. The query lasts about > 3 hours. All I want is to update the flag for highest version of each > client's record. Any suggestion is welcome! > > Thanks, > > Mike > > > ====SQL=========== > update empTbl A > set flag=1 > where > rec_ver = > ( select max(rec_ver) > from empTbl > where empNo = A.empNo) > > > > ===Table empTbl===== > > empTbl > { > int empNo; > int flag; > char[256] empDesc; > int rec_ver; > } Try this: update empTbl A set flag=1 from (select empno, max(rec_ver) as rec_ver from empTbl group by empno) foo where (a.empno,a.rec_ver) = (foo.empno, foo.rec_ver); You should create an index on empTbl(empNo,rec_ver). Please show us the EXPLAIN ANALYSE for both selects. Regards, Andreas -- Andreas Kretschmer Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header) GnuPG: 0x31720C99, 1006 CCB4 A326 1D42 6431 2EB0 389D 1DC2 3172 0C99