Received: from localhost (mx1.hub.org [200.46.208.251]) by postgresql.org (Postfix) with ESMTP id 804969FA339 for ; Sat, 21 Oct 2006 07:44:29 -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 16732-10 for ; Sat, 21 Oct 2006 07:44:21 -0300 (ADT) X-Greylist: delayed 00:21:41.77942 by SQLgrey- Received: from svr4.postgresql.org (svr4.postgresql.org [66.98.251.159]) by postgresql.org (Postfix) with ESMTP id 1BE419FA38F for ; Sat, 21 Oct 2006 07:44:20 -0300 (ADT) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.3 Received: from chemaxon.com (chemaxon.com [195.228.156.90]) by svr4.postgresql.org (Postfix) with ESMTP id 2E5AC5AFA3F for ; Sat, 21 Oct 2006 10:22:32 +0000 (GMT) Message-ID: <4539F4E1.7000003@chemaxon.hu> Date: Sat, 21 Oct 2006 12:22:25 +0200 From: =?ISO-8859-1?Q?P=E9ter_Kov=E1cs?= User-Agent: Thunderbird 1.5.0.7 (Windows/20060909) MIME-Version: 1.0 To: Heikki Linnakangas Cc: Arnaud Lesauvage , pgsql-performance@postgresql.org Subject: Re: Index on two columns not used References: <45360E25.9010403@freesurf.fr> <45361295.9050504@enterprisedb.com> In-Reply-To: <45361295.9050504@enterprisedb.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Authenticated-Sender: 34e871c5d358cda5d864dac8b91bd9d9 X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0.954 tagged_above=0 required=5 tests=AWL X-Spam-Level: X-Archive-Number: 200610/456 X-Sequence-Number: 21585 Sorry for the amateurish question, but what are "heap tuples"? Also, my understanding is that the following statement applies only for composite indexes: "PostgreSQL can't use the values stored in the index to check the join condition". I assume that PostgreSQL will be able to use single-column-indexes for join conditions. Is this correct? Thank you, Peter Heikki Linnakangas wrote: > Arnaud Lesauvage wrote: >> I have two table with a 2-column index on both of them. >> In the first table, the first colum of the index is the primary key, >> the second one is an integer field. >> In the second table, the two columns are the primary key. >> When I join these two tables, the 2-column index of the first table >> is not used. >> Why does the query planner think that this plan is better ? >> >> ALTER TABLE geo.subcities_names >> ADD CONSTRAINT subcities_names_pkey PRIMARY KEY(subcity_gid, >> language_id); >> >> CREATE INDEX subcities_gid_language_id >> ON geo.subcities >> USING btree >> (gid, official_language_id); >> >> EXPLAIN ANALYZE >> SELECT * FROM geo.subcities sc, geo.subcities_names scn >> WHERE sc.gid = scn.subcity_gid AND sc.official_language_id = >> scn.language_id; > > My theory: > > There's no additional restrictions besides the join condition, so the > system has to scan both tables completely. It chooses to use a full > index scan instead of a seq scan to be able to do a merge join. > Because it's going to have to scan the indexes completely anyway, it > chooses the smallest index which is subcities_pkey. > > You'd think that the system could do the merge using just the indexes, > and only fetch the heap tuples for matches. If that were the case, > using the 2-column index would indeed be a good idea. However, > PostgreSQL can't use the values stored in the index to check the join > condition, so all the heap tuples are fetched anyway. There was just > recently discussion about this on this list: > http://archives.postgresql.org/pgsql-performance/2006-09/msg00080.php. >