X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (av.hub.org [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id D1AB4DA1FA for ; Wed, 5 Oct 2005 13:48:58 -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 56342-03 for ; Wed, 5 Oct 2005 16:48:56 +0000 (GMT) Received: from megazone.bigpanda.com (megazone.bigpanda.com [64.147.171.210]) by svr1.postgresql.org (Postfix) with ESMTP id 88966DA1A5 for ; Wed, 5 Oct 2005 13:48:55 -0300 (ADT) Received: by megazone.bigpanda.com (Postfix, from userid 1001) id BD374352A2; Wed, 5 Oct 2005 09:48:55 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by megazone.bigpanda.com (Postfix) with ESMTP id BB92F35290; Wed, 5 Oct 2005 09:48:55 -0700 (PDT) Date: Wed, 5 Oct 2005 09:48:55 -0700 (PDT) From: Stephan Szabo To: "Leif B. Kristensen" Cc: "Pgsql-sql@postgresql.org" Subject: Re: Use of partial index In-Reply-To: <200510051717.24390.leif@solumslekt.org> Message-ID: <20051005094704.F85645@megazone.bigpanda.com> References: <200510051717.24390.leif@solumslekt.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.11 required=5 tests=[AWL=-0.097, UPPERCASE_25_50=0.207] X-Spam-Level: X-Archive-Number: 200510/43 X-Sequence-Number: 22896 On Wed, 5 Oct 2005, Leif B. Kristensen wrote: > I'm a little confused about partial indexes. I have a couple of tables, > like this: > > CREATE TABLE events ( > event_id INTEGER PRIMARY KEY, > tag_type_fk INTEGER REFERENCES tag_types (tag_type_id), > place_fk INTEGER REFERENCES places (place_id), > event_date CHAR(18) NOT NULL DEFAULT '000000003000000001', > sort_date DATE NOT NULL DEFAULT '40041024BC', > event_text TEXT NOT NULL DEFAULT '', > sentence TEXT NOT NULL DEFAULT '' > ); > > To this table I have created a partial index: > > CREATE INDEX events_born > ON events (tag_type_fk) > WHERE tag_type_fk = 2; > > Another table: > > CREATE TABLE participants ( -- the TMG 'E' file > participant_id INTEGER PRIMARY KEY, > person_fk INTEGER REFERENCES persons (person_id), > event_fk INTEGER REFERENCES events (event_id), > role_type_fk INTEGER REFERENCES role_types (role_type_id), > is_principal BOOLEAN NOT NULL DEFAULT 'f', > is_primary_event BOOLEAN NOT NULL DEFAULT 'f', > participant_note TEXT NOT NULL DEFAULT '', > participant_name TEXT NOT NULL DEFAULT '', > age_mean INTEGER NOT NULL DEFAULT 0, > age_devi INTEGER NOT NULL DEFAULT 0, > CONSTRAINT person_event UNIQUE (person_id, event_id) > ); > > And a view: > > CREATE OR REPLACE VIEW principals AS > SELECT > participants.person_fk AS person, > events.event_id AS event, > events.place_fk AS place, > events.event_date AS event_date, > events.sort_date AS sort_date, > events.tag_type_fk AS tag_type > FROM > events, participants > WHERE > events.event_id = participants.event_fk > AND > participants.is_principal IS TRUE; > > Now, here's an "explain select": > > pgslekt=> explain select event_date, place from principals where > person=2 and tag_type=2; > QUERY PLAN > ----------------------------------------------------------------------- > Nested Loop (cost=0.00..23.15 rows=2 width=26) > -> Index Scan using person_event on participants > (cost=0.00..13.63 rows=3 width=4) > Index Cond: (person_fk = 2) > Filter: (is_principal IS TRUE) > -> Index Scan using events_pkey on events > (cost=0.00..3.16 rows=1 width=30) > Index Cond: (events.event_id = "outer".event_fk) > Filter: (tag_type_fk = 2) > (7 rader) > > Why doesn't this SELECT use the partial index "events_born" above? Is > there any way to make this happen? I would think you'd want an index ON events(event_id) WHERE tag_type_fk=2 for the query given.