X-Original-To: pgsql-performance-postgresql.org@localhost.postgresql.org Received: from localhost (av.hub.org [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 890E1D8EA1 for ; Fri, 23 Sep 2005 08:31:04 -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 36998-03 for ; Fri, 23 Sep 2005 11:30:59 +0000 (GMT) Received: from net2.micro-automation.com (net2.micro-automation.com [64.7.141.29]) by svr1.postgresql.org (Postfix) with SMTP id 6E2FFD8EA0 for ; Fri, 23 Sep 2005 08:30:59 -0300 (ADT) Received: (qmail 24440 invoked from network); 23 Sep 2005 11:31:01 -0000 Received: from dcdsl.ebox.com (HELO ?192.168.1.2?) (davec@64.7.143.116) by net2.micro-automation.com with SMTP; 23 Sep 2005 11:31:01 -0000 In-Reply-To: <1127458167.2475.105.camel@Panoramix> References: <1127458167.2475.105.camel@Panoramix> Mime-Version: 1.0 (Apple Message framework v734) Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Message-Id: Cc: Pgsql-Performance Content-Transfer-Encoding: 7bit From: Dave Cramer Subject: Re: How to determine cause of performance problem? Date: Fri, 23 Sep 2005 07:30:59 -0400 To: Joost Kraaijeveld X-Mailer: Apple Mail (2.734) X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.02 required=5 tests=[AWL=0.020] X-Spam-Level: X-Archive-Number: 200509/286 X-Sequence-Number: 14594 Joost, I presume you are using a relatively new jdbc driver. Make sure you have added prepareThreshold=1 to the url to that it will use a named server side prepared statement You could also use your mod 100 code block to implement batch processing of the inserts. see addBatch, in jdbc specs Dave On 23-Sep-05, at 2:49 AM, Joost Kraaijeveld wrote: > Hi, > > I must convert an old table into a new table. The conversion goes at ~ > 100 records per second. Given the fact that I must convert 40 million > records, it takes too much time: more hours than the 48 hour weekend I > have for the conversion;-). > > The tables are rather simple: both tables only have a primary key > constraint (of type text) and no other indexes. I only copy 3 > columns. I > use Java for the conversion. For the exact code see below. > > During the conversion my processor load is almost non existant. The > harddisk throughput is ~ 6 megabyte/second max (measured with iostat). > > My platform is Debian Sarge AMD64. My hardware is a Tyan Thunder K8W > 2885 motherboard, 2 Opteron 248 processors, 2 GB RAM, a SATA bootdisk > with / and swap, and a 3Ware 9500S-8 RAID-5 controller with 5 attached > SATA disks with /home and /var. /var contains *all* PostgreSQL log and > database files (default Debian installation). > > Output of hdparm -Tt /dev/sdb (sdb is the RAID opartition) > > /dev/sdb: > Timing cached reads: 1696 MB in 2.00 seconds = 846.86 MB/sec > Timing buffered disk reads: 246 MB in 3.01 seconds = 81.79 MB/sec > > > I want to determine the cause of my performance problem (if it is > one). > > 1. Is this a performance I can expect? > 2. If not, how can I determine the cause? > 3. Can I anyhow improve the performance without replacing my hardware, > e.g. by tweaking the software? > 4. Is there a Linux (Debian) tool that I can use to benchmark write > performance? > > > > -- > Groeten, > > Joost Kraaijeveld > Askesis B.V. > Molukkenstraat 14 > 6524NB Nijmegen > tel: 024-3888063 / 06-51855277 > fax: 024-3608416 > e-mail: J.Kraaijeveld@Askesis.nl > web: www.askesis.nl > > > The Java code I use for the conversion : > > //////////////// .... > ResultSet resultSet = selectStatement.executeQuery( > "select ordernummer, orderdatum, klantnummer from odbc.orders order by > ordernummer"); > > connection.setAutoCommit(false); > > PreparedStatement ordersInsertStatement = > connection.prepareStatement("insert into prototype.orders > (objectid,ordernumber,orderdate,customernumber) values (?,?,?,?)"); > > while( resultSet.next() ) > { > > if( (++record % 100) == 0){ > System.err.println( "handling record: " + record); > } > > // the next line can do > 1.000.000 objectId/sec > String orderObjectId = ObjectIdGenerator.newObjectId(); > ordersInsertStatement.setString(1,orderObjectId); > ordersInsertStatement.setInt(2,resultSet.getInt("ordernummer")); > ordersInsertStatement.setDate(3,resultSet.getDate("orderdatum")); > ordersInsertStatement.setInt(4,resultSet.getInt("klantnummer")); > > ordersInsertStatement.execute(); > > } > > connection.commit(); > > > ---------------------------(end of > broadcast)--------------------------- > TIP 3: Have you checked our extensive FAQ? > > http://www.postgresql.org/docs/faq > >