X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (neptune.hub.org [200.46.204.2]) by svr1.postgresql.org (Postfix) with ESMTP id 38953D1B4CA for ; Thu, 27 Nov 2003 17:13:17 +0000 (GMT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (neptune.hub.org [200.46.204.2]) (amavisd-new, port 10024) with ESMTP id 04716-08 for ; Thu, 27 Nov 2003 13:12:46 -0400 (AST) Received: from serwer.skawsoft.com.pl (skawina.eu.org [80.48.213.66]) by svr1.postgresql.org (Postfix) with ESMTP id 01D0CD1B4BC for ; Thu, 27 Nov 2003 13:12:44 -0400 (AST) Received: from klaster.net (core-1.citynet.pl [80.48.135.69]) by serwer.skawsoft.com.pl (Postfix) with ESMTP id C4D092B3D5 for ; Thu, 27 Nov 2003 18:11:44 +0100 (CET) Message-ID: <3FC63057.3080009@klaster.net> Date: Thu, 27 Nov 2003 18:11:51 +0100 From: Tomasz Myrta User-Agent: Mozilla/5.0 (Windows; U; Win 9x 4.90; pl-PL; rv:1.5) Gecko/20031007 X-Accept-Language: pl, en-us, en MIME-Version: 1.0 To: Lista dyskusyjna pgsql-sql Subject: explicit joins wrong planning Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200311/307 X-Sequence-Number: 16122 Hi SELECT version(); PostgreSQL 7.3.4 on i386-pc-linux-gnu, compiled by GCC i386-linux-gcc (GCC) 3.3.2 20031005 (Debian prerelease) Let's say I have 3 tables: groups ( groupid integer primary key, name varchar, begindate date ); offsets ( offset_id integer, groupid integer references groups, offset_value integer ); events ( offset_id integer references offsets, event_date date, primary key (offset_id,event_date) ); explain analyze select * from groups g join offsets o using (groupid) join events e on (e.offsetid=o.offset_id and e.event_date=g.begindate+o.offset_value) where g.name='some_name'; Postgres doesn't use join on these both fields and doesn't use index scan properly. I get: Hash Cond: ("outer".offset_id = "inner".offset_id) Join Filter: ("outer".event_date = ("inner".begindate + "inner".offset_value)) Why? I lost few hours trying to fix it and I found, that copying one of these conditions into where clause solved my problem: explain analyze select * from groups g join offsets o using (groupid) join events e on (e.offsetid=o.offset_id and e.event_date=g.begindate+o.offset_value) where g.name='some_name' and e.offsetid=o.offset_id; Join Filter: ("outer".event_date = ("inner".begindate + "inner".offset_value)) Nested Loop... Join Filter: ("outer".offset_id = "inner".offset_id) Why? What was I doing wrong? Regards, Tomasz Myrta