Received: from localhost (mx1.hub.org [200.46.208.251]) by postgresql.org (Postfix) with ESMTP id 9FEC29FB3B5 for ; Wed, 27 Sep 2006 06:48:15 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.208.251]) (amavisd-new, port 10024) with ESMTP id 42709-06 for ; Wed, 27 Sep 2006 06:48:09 -0300 (ADT) X-Greylist: delayed 14:12:18.069419 by SQLgrey- Received: from lynet.oppetid.no (oppetid.no [80.65.51.2]) by postgresql.org (Postfix) with ESMTP id 0C8C39FB3CB for ; Wed, 27 Sep 2006 06:48:08 -0300 (ADT) Received: by lynet.oppetid.no (Postfix, from userid 1019) id 9997211AF92; Wed, 27 Sep 2006 11:48:03 +0200 (CEST) Date: Wed, 27 Sep 2006 11:48:03 +0200 From: Tobias Brox To: Tom Lane Cc: Tobias Brox , pgsql-performance@postgresql.org Subject: Re: Merge Join vs Nested Loop Message-ID: <20060927094803.GA11245@oppetid.no> References: <20060926193553.GA27268@oppetid.no> <719.1159308596@sss.pgh.pa.us> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <719.1159308596@sss.pgh.pa.us> Organization: Group Nordicbet User-Agent: Mutt/1.5.9i X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0.185 tagged_above=0 required=5 tests=AWL, FORGED_RCVD_HELO X-Spam-Level: X-Archive-Number: 200609/349 X-Sequence-Number: 21035 [Tom Lane - Tue at 06:09:56PM -0400] > If your tables are small enough to fit (mostly) in memory, then the > planner tends to overestimate the cost of a nestloop because it fails to > account for cacheing effects across multiple scans of the inner table. > This is addressed in 8.2, but in earlier versions about all you can do > is reduce random_page_cost, and a sane setting of that (ie not less than > 1.0) may not be enough to push the cost estimates where you want them. > Still, reducing random_page_cost ought to be your first recourse. Thank you. Reducing the random page hit cost did reduce the nested loop cost significantly, sadly the merge join costs where reduced even further, causing the planner to favor those even more than before. Setting the effective_cache_size really low solved the issue, but I believe we rather want to have a high effective_cache_size. Eventually, setting the effective_cache_size to near-0, and setting random_page_cost to 1 could maybe be a desperate measure. Another one is to turn off merge/hash joins and seq scans. It could be a worthwhile experiment if nothing else :-) The bulk of our database is historical data that most often is not touched at all, though one never knows for sure until the queries have run all through - so table partitioning is not an option, it seems like. My general idea is that nested loops would cause the most recent data and most important part of the indexes to stay in the OS cache. Does this make sense from an experts point of view? :-)