Received: from maia.hub.org (maia-2.hub.org [200.46.204.251]) by mail.postgresql.org (Postfix) with ESMTP id CC7081337B64 for ; Tue, 30 Nov 2010 19:22:42 -0400 (AST) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.251]) (amavisd-maia, port 10024) with ESMTP id 74861-08 for ; Tue, 30 Nov 2010 23:22:35 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from out.mail.amis.hr (out2.mail.amis.hr [188.129.0.5]) by mail.postgresql.org (Postfix) with ESMTP id 3BDC71337B63 for ; Tue, 30 Nov 2010 19:22:35 -0400 (AST) Received: from out.fsec.sm.srv.amis.hr (out.fsec.sm.srv.amis.hr [192.168.106.22]) by out.mail.amis.hr (Postfix) with ESMTP id 5FE3A203CF; Wed, 1 Dec 2010 00:22:34 +0100 (CET) Received: from pps.filterd (out [127.0.0.1]) by out.fsec.sm.srv.amis.hr (8.14.3/8.14.3) with SMTP id oAUNMGue020810; Wed, 1 Dec 2010 00:22:34 +0100 Received: from smtp.amis.hr (smtp.sm.srv.amis.hr [192.168.106.39]) by out.fsec.sm.srv.amis.hr with ESMTP id sw86f829p-1; Wed, 01 Dec 2010 00:22:33 +0100 A-Original-Client-UID: 188.129.71.39 splivalo Received: from [192.168.10.1] (cpe-188-129-71-39.dynamic.amis.hr [188.129.71.39]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: splivalo) by smtp.amis.hr (Postfix) with ESMTPSA id A1D5A261; Wed, 1 Dec 2010 00:22:33 +0100 (CET) Message-ID: <4CF58739.7050904@megafon.hr> Date: Wed, 01 Dec 2010 00:22:33 +0100 From: Mario Splivalo User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101027 Lightning/1.0b1 Thunderbird/3.0.10 MIME-Version: 1.0 To: Pierre C CC: pgsql-performance@postgresql.org Subject: Re: SELECT INTO large FKyed table is slow References: <4CF24103.8030209@megafon.hr> <4CF2A8A6.4010400@megafon.hr> <4CF39B57.9030306@megafon.hr> In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.2.15, 1.0.148, 0.0.0000 definitions=2010-11-30_12:2010-11-30, 2010-11-30, 1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 ipscore=0 suspectscore=0 phishscore=0 bulkscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx engine=6.0.2-1010190000 definitions=main-1011300163 X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=-1.9 tagged_above=-10 required=5 tests=BAYES_00=-1.9 X-Spam-Level: X-Archive-Number: 201011/418 X-Sequence-Number: 41442 On 11/29/2010 05:47 PM, Pierre C wrote: >> realm_51=# vacuum analyze verbose drones; >> INFO: vacuuming "public.drones" >> INFO: scanned index "drones_pk" to remove 242235 row versions >> DETAIL: CPU 0.02s/0.11u sec elapsed 0.28 sec. >> INFO: "drones": removed 242235 row versions in 1952 pages >> DETAIL: CPU 0.01s/0.02u sec elapsed 0.03 sec. >> INFO: index "drones_pk" now contains 174068 row versions in 721 pages >> DETAIL: 107716 index row versions were removed. >> 0 index pages have been deleted, 0 are currently reusable. > > As you can see your index contains 174068 active rows and 242235 dead > rows that probably should have been removed a long time ago by > autovacuum, but you seem to have it turned off. It does not take a long > time to vacuum this table (only 0.3 sec) so it is not a high cost, you > should enable autovacuum and let it do the job (note that this doesn't > stop you from manual vacuuming after big updates). Yes, you're right. I was doing some testing and I neglected to enable vacuuming after inserts. But what this shows is that table drones is having dead rows, and that table does get updated a lot. However, I don't have any performance problems here. The UPDATE takes no more than 10 seconds even if I update 50k (out of 150k) rows. I disabled autovacuum because I got a lot of "WARNING: pgstat wait timeout" and I could see the autovacuum job (pg_stat_activity) running during the run of the plpgsql function that handles inserts. I left the autovacuum off but I do VACUUM after each CSV insert. > good > >> 0 index pages have been deleted, 0 are currently reusable. >> CPU 0.38s/0.12u sec elapsed 16.56 sec. >> INFO: "drones_history": found 0 removable, 16903164 nonremovable row >> versions in 129866 out of 195180 pages >> DETAIL: 0 dead row versions cannot be removed yet. >> There were 0 unused item pointers. >> 0 pages are entirely empty. >> CPU 2.00s/1.42u sec elapsed 49.24 sec. > > good > >> INFO: vacuuming "pg_toast.pg_toast_2695510" >> INFO: index "pg_toast_2695510_index" now contains 0 row versions in 1 >> pages >> DETAIL: 0 index row versions were removed. >> 0 index pages have been deleted, 0 are currently reusable. >> CPU 0.00s/0.00u sec elapsed 0.00 sec. >> INFO: "pg_toast_2695510": found 0 removable, 0 nonremovable row >> versions in 0 out of 0 pages >> DETAIL: 0 dead row versions cannot be removed yet. >> There were 0 unused item pointers. >> 0 pages are entirely empty. >> CPU 0.00s/0.00u sec elapsed 0.00 sec. > > same as above, no toast Yes. Just to make things clear, I never update/delete drones_history. I just INSERT, and every now and then I'll be doing SELECTs. > > >> realm_51=# select version(); >> version >> --------------------------------------------------------------------------------------------- >> >> PostgreSQL 8.4.2 on i686-pc-linux-gnu, compiled by GCC gcc (Debian >> 4.3.2-1.1) 4.3.2, 32-bit >> (1 row) >> >> >> Mario > > ok > > Try this : > > CLUSTER drones_pkey ON drones; > > Then check if your slow query gets a bit faster. If it does, try : > > ALTER TABLE drones SET ( fillfactor = 50 ); > ALTER INDEX drones_pkey SET ( fillfactor = 50 ); > CLUSTER drones_pkey ON drones; (again) > > This will make the updates on this table less problematic. VACUUM it > after each mass update. Is this going to make any difference considering slow insert on drones_history? Because INSERTs/UPDATEs on drones tables are fast. The only noticable difference is that drones is 150k rows 'large' and drones_history has around 25M rows: realm_51=# select count(*) from drones_history ; count ---------- 25550475 (1 row) Mario