Received: from localhost (unknown [200.46.204.184]) by postgresql.org (Postfix) with ESMTP id EA43B2E034D for ; Mon, 10 Mar 2008 14:16:12 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.184]) (amavisd-maia, port 10024) with ESMTP id 48871-01-4 for ; Mon, 10 Mar 2008 14:15:56 -0300 (ADT) X-Greylist: delayed 00:20:00.746834 by SQLgrey-1.7.5 Received: from arachne.Acrys.COM (gateway.acrys.com [212.222.64.34]) by postgresql.org (Postfix) with ESMTP id CA98B2E015C for ; Mon, 10 Mar 2008 14:15:53 -0300 (ADT) Received: from Acrys.COM (root@devil.acrys.com [10.0.2.10]) by arachne.Acrys.COM (8.13.5.20060308/8.13.5/1.4) with ESMTP id m2AGtnno011568; Mon, 10 Mar 2008 17:55:49 +0100 (CET) Received: from [10.0.2.73] (nb-pruy.acrys.com [10.0.2.73]) by Acrys.COM (8.14.1/8.12.11/2.11) with ESMTP id m2AGth0Z023084; Mon, 10 Mar 2008 17:55:44 +0100 (CET) Message-ID: <47D5680F.6080508@acrys.com> Date: Mon, 10 Mar 2008 17:55:43 +0100 From: Rainer Pruy Organization: Acrys Consult GmbH & Co. KG User-Agent: Thunderbird 2.0.0.12 (X11/20080226) MIME-Version: 1.0 To: Craig Ringer CC: pgsql-performance@postgresql.org Subject: Re: Very slow (2 tuples/second) sequential scan after bulk insert; speed returns to ~500 tuples/second after commit References: <47D505AF.4040101@postnewspapers.com.au> <47D5150C.8090802@enterprisedb.com> <47D51B7D.4010800@postnewspapers.com.au> In-Reply-To: <47D51B7D.4010800@postnewspapers.com.au> X-Enigmail-Version: 0.95.2 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Virus-Scanned: ClamAV version 0.92.1, clamav-milter version 0.92.1 on devil.Acrys.COM X-Virus-Status: Clean X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-2.1.2 (arachne.Acrys.COM [212.222.64.34]); Mon, 10 Mar 2008 17:55:49 +0100 (CET) X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0 tagged_above=0 required=5 tests=none X-Spam-Level: X-Archive-Number: 200803/205 X-Sequence-Number: 29159 We experienced a similar degradation, when heavily using savepoints within a single transaction. However, we had not yet enough time to really investigate the issue. It also was not directly reproducible using a (small) set of statements from a script. As the overall scenario "bulk loads with sub-transactions" is close to the scenario we do run, it might come down to the same reason, so. Thus take my vote for a solution that does not end up with "don't use (sub-) transactions". Regards, Rainer Craig Ringer schrieb: > Thanks for the extremely helpful response. I don't think I would've > spotted that one in a hurry. > >> You must be having an exception handler block in that pl/pgsql >> function, which implicitly creates a new subtransaction on each >> invocation of the exception handler block, so you end up with hundreds >> of thousands of committed subtransactions. > > Aah - yes, there is. I didn't realize it'd have such an impact. I can > work around the need for it by explicitly checking the table constraints > in the function - in which case an uncaught exception will terminate the > transaction, but should only arise when I've missed a constraint check. > >> For 8.4, it would be nice to improve that. I tested that on my laptop >> with a similarly-sized table, inserting each row in a pl/pgsql >> function with an exception handler, and I got very similar run times. >> According to oprofile, all the time is spent in >> TransactionIdIsInProgress. I think it would be pretty straightforward >> to store the committed subtransaction ids in a sorted array, instead >> of a linked list, and binary search. Or to use a hash table. That >> should eliminate this problem, though there is still other places as >> well where a large number of subtransactions will hurt performance. > > That does sound interesting - and it would be nice to be able to use > exception handlers this way without too huge a performance hit. In the > end though it's something that can be designed around once you're aware > of it - and I'm sure that other ways of storing that data have their own > different costs and downsides. > > What might also be nice, and simpler, would be a `notice', `log', or > even `debug1' level warning telling the user they've reached an absurd > number of subtransactions that'll cripple PostgreSQL's performance - say > 100,000. There's precedent for this in the checkpoint frequency warning > 8.3 produces if checkpoints are becoming too frequent - and like that > warning it could be configurable for big sites. If you think that's sane > I might have a go at it - though I mostly work in C++ so the result > probably won't be too pretty initially. > > -- > Craig Ringer > -- Rainer Pruy Geschäftsführer Acrys Consult GmbH & Co. KG Untermainkai 29-30, D-60329 Frankfurt Tel: +49-69-244506-0 - Fax: +49-69-244506-50 Web: http://www.acrys.com - Email: office@acrys.com Handelsregister: Frankfurt am Main, HRA 31151