X-Original-To: pgsql-patches-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 1E30552927 for ; Tue, 9 Aug 2005 21:41:34 -0300 (ADT) 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 47137-05 for ; Wed, 10 Aug 2005 00:41:23 +0000 (GMT) Received: from mail.Mi8.com (d01gw01.mi8.com [63.240.6.47]) by svr1.postgresql.org (Postfix) with ESMTP id 3FB5B5295C for ; Tue, 9 Aug 2005 21:41:21 -0300 (ADT) Received: from 172.16.1.110 by mail.Mi8.com with ESMTP (- Welcome to Mi8 Corporation www.Mi8.com (D1)); Tue, 09 Aug 2005 20:41:19 -0400 X-Server-Uuid: 241911D6-425B-44B9-A073-E3FE0F8FC774 Received: from MI8NYCMAIL06.Mi8.com ([172.16.1.175]) by D01SMTP01.Mi8.com with Microsoft SMTPSVC(6.0.3790.211); Tue, 9 Aug 2005 20:41:18 -0400 Received: from 67.103.45.218 ([67.103.45.218]) by MI8NYCMAIL06.Mi8.com ( [172.16.1.219]) via Exchange Front-End Server mi8owa.mi8.com ( [172.16.1.104]) with Microsoft Exchange Server HTTP-DAV ; Tue, 9 Aug 2005 20:41:18 -0500 User-Agent: Microsoft-Entourage/11.1.0.040913 Date: Tue, 09 Aug 2005 17:41:18 -0700 Subject: Re: COPY FROM performance improvements From: "Alon Goldshuv" To: pgsql-patches@postgresql.org Message-ID: In-Reply-To: MIME-Version: 1.0 X-OriginalArrivalTime: 10 Aug 2005 00:41:18.0936 (UTC) FILETIME=[38FCDD80:01C59D44] X-WSS-ID: 6EE792A52B416104077-01-01 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=1.593 tagged_above=0 required=5 tests=AWL, FORGED_RCVD_HELO, RCVD_NUMERIC_HELO X-Spam-Level: * X-Archive-Number: 200508/75 X-Sequence-Number: 17022 I did some performance checks after the recent code commit. The good news is that the parsing speed of COPY is now MUCH faster, which is great. It is about 5 times faster - about 100MB/sec on my machine (previously 20MB/sec at best, usually less). The better news is that my original patch parsing speed reaches 120MB/sec, about 20MB/sec faster than the code that's now in CVS. This can be significant for the long scheme of things and for large data sets. Maybe we can improve the current code a bit more to reach this number. I performed those measurement by executing *only the parsing logic* of the COPY pipeline. All data conversion (functioncall3(string...)) and tuple handling (form_heaptuple etc...) and insertion were manually disabled. So the only code measured is reading from disk and parsing to the attribute level. Cheers, Alon. On 8/7/05 1:21 AM, "Luke Lonergan" wrote: > Tom, > > On 8/6/05 9:08 PM, "Tom Lane" wrote: > >> "Luke Lonergan" writes: >>>> I had some difficulty in generating test cases that weren't largely >>>> I/O-bound, but AFAICT the patch as applied is about the same speed >>>> as what you submitted. >> >>> You achieve the important objective of knocking the parsing stage down a >>> lot, but your parsing code is actually about 20% slower than Alon's. >> >> I would like to see the exact test case you are using to make this >> claim; the tests I did suggested my code is the same speed or faster. > > I showed mine - you show yours :-) Apparently our e-mail crossed. > >> As best I can tell, my version of CopyReadAttributes is significantly >> quicker than Alon's, approximately balancing out the fact that my >> version of CopyReadLine is slower. I did the latter first, and would >> now be tempted to rewrite it in the same style as CopyReadAttributes, >> ie one pass of memory-to-memory copy using pointers rather than buffer >> indexes. > > See previous timings - looks like Alon's parsing is substantially faster. > However, I'd like him to confirm by running with the "shunt" placed at > different stages, in this case between parse and attribute conversion (not > attribute parse). > >> BTW, late today I figured out a way to get fairly reproducible >> non-I/O-bound numbers about COPY FROM: use a trigger that suppresses >> the actual inserts, thus: >> >> create table foo ... >> create function noway() returns trigger as >> 'begin return null; end' language plpgsql; >> create trigger noway before insert on foo >> for each row execute procedure noway(); >> then repeat: >> copy foo from '/tmp/foo.data'; > > Cool! That's a better way than hacking code and inserting shunts. > > Alon will likely hit this tomorrow. > > - Luke >