Received: from localhost (maia-3.hub.org [200.46.204.184]) by postgresql.org (Postfix) with ESMTP id 7AF4E9FBB92 for ; Tue, 5 Jun 2007 13:49: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 53370-01 for ; Tue, 5 Jun 2007 13:49:08 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.4 Received: from exchange.g2switchworks.com (mail.g2switchworks.com [63.87.162.25]) by postgresql.org (Postfix) with ESMTP id 15FCE9FB919 for ; Tue, 5 Jun 2007 13:48:38 -0300 (ADT) Received: from [10.10.1.37] ([10.10.1.37]) by exchange.g2switchworks.com with Microsoft SMTPSVC(6.0.3790.1830); Tue, 5 Jun 2007 11:48:38 -0500 Message-ID: <466593E5.1010904@g2switchworks.com> Date: Tue, 05 Jun 2007 11:48:37 -0500 From: Scott Marlowe User-Agent: Thunderbird 1.5.0.4 (X11/20060516) MIME-Version: 1.0 To: david@lang.hm CC: Gregory Stark , Thomas Andrews , Mark Lewis , pgsql-performance@postgresql.org Subject: Re: Thousands of tables versus on table? References: <1180980943.31471.322.camel@archimedes> <46645DD9.7030805@soliantconsulting.com> <877iqjmro5.fsf@oxford.xeocode.com> <46647427.4030103@g2switchworks.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 05 Jun 2007 16:48:38.0033 (UTC) FILETIME=[5D464010:01C7A791] X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200706/71 X-Sequence-Number: 25104 david@lang.hm wrote: > On Mon, 4 Jun 2007, Scott Marlowe wrote: > >> Gregory Stark wrote: >>> "Thomas Andrews" writes: >>> >>> >>> > I guess my real question is, does it ever make sense to create >>> thousands > of >>> > tables like this? >>> > >>> Sometimes. But usually it's not a good idea. >>> What you're proposing is basically partitioning, though you may not >>> actually >>> need to put all the partitions together for your purposes. >>> Partitioning's >>> main >>> benefit is in the management of the data. You can drop and load >>> partitions >>> in >>> chunks rather than have to perform large operations on millions of >>> records. >>> >>> Postgres doesn't really get any faster by breaking the tables up like >>> that. In >>> fact it probably gets slower as it has to look up which of the >>> thousands >>> of >>> tables you want to work with. >>> >> >> That's not entirely true. PostgreSQL can be markedly faster using >> partitioning as long as you always access it by referencing the >> partitioning key in the where clause. So, if you partition the table >> by date, and always reference it with a date in the where clause, it >> will usually be noticeably faster. OTOH, if you access it without >> using a where clause that lets it pick partitions, then it will be >> slower than one big table. >> >> So, while this poster might originally think to have one table for >> each user, resulting in thousands of tables, maybe a compromise where >> you partition on userid ranges would work out well, and keep each >> partition table down to some 50-100 thousand rows, with smaller >> indexes to match. >> > > what if he doesn't use the postgres internal partitioning, but instead > makes his code access the tables named responsesNNNNN where NNNNN is > the id of the customer? > > this is what it sounded like he was asking initially. Sorry, I think I initially read your response as "Postgres doesn't really get any faster by breaking the tables up" without the "like that" part. I've found that as long as the number of tables is > 10,000 or so, having a lot of tables doesn't seem to really slow pgsql down a lot. I'm sure that the tipping point is dependent on your db machine. I would bet that if he's referring to individual tables directly, and each one has hundreds instead of millions of rows, the performance would be better. But the only way to be sure is to test it.