From: | Scott Marlowe <scott(dot)marlowe(at)gmail(dot)com> |
---|---|
To: | Paul Wehr <sf_psql_general(at)informationsoftworks(dot)com> |
Cc: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: BUMP: Using foreign key constraint to eliminate unnecessary joins in view |
Date: | 2009-04-13 21:26:33 |
Message-ID: | dcc563d10904131426k3b4af869gf64633d6f097fd3b@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Mon, Apr 13, 2009 at 1:36 PM, Paul Wehr
<sf_psql_general(at)informationsoftworks(dot)com> wrote:
>
> A last try on this question. In the absence of any response, I'll assume
> the postgresql query optimizer simply doesn't take foreign keys into
> account in this way.
>
> -------- Original Message --------
> Subject: Using foreign key constraint to eliminate unnecessary joins in
> view
> Date: Sun, 29 Mar 2009 14:00:53 -0400
> From: Paul Wehr <sf_psql_general(at)informationsoftworks(dot)com>
> To: pgsql-general(at)postgresql(dot)org
>
> I could be wrong, but I would swear I was once able to set up my foreign
> key constraints so that the optimizer would not bother looking up rows in
> tables that did not contribute to the result set. This is useful because I
> can set up a single view that joins all the related tables together, but
> can still get the performance of a view that only includes the tables I'm
> interested in at the time.
>
> Here is a simple example of what I mean:
>
> ------ begin example
>
> create table test1 (
> a serial not null,
> b text,
> primary key (a)
> );
>
> create table test2 (
> c text,
> d integer,
> constraint test2_fk foreign key (d) references test1(a) not deferrable
> ;
>
> insert into test1 (b) values ('test1');
> insert into test1 (b) values ('test2');
>
> insert into test2 values ('hey',1);
> insert into test2 values ('stuff',1);
> insert into test2 values ('thing',2);
>
> explain
> select c
> from test2, test1
> where test1.a = test2.d
>
> ------- end example
>
> Explain plan from postgresql 8.3.7:
> Hash Join (cost=37.67..76.89 rows=1230 width=32)
> Hash Cond: (test2.d = test1.a)
> -> Seq Scan on test2 (cost=0.00..22.30 rows=1230 width=36)
> -> Hash (cost=22.30..22.30 rows=1230 width=4)
> -> Seq Scan on test1 (cost=0.00..22.30 rows=1230 width=4)
>
> I am looking for a way to get the plan to show only a seq scan of test2,
> since test1 does not contribute any columns, and we know from the
> not-deferrable-not-null-primary-key that there will always be exactly one
> match.
>
> Am I just missing something obvious, or does postgresql (currently) not do
> that?
Have you tried an index on test1.c?
From | Date | Subject | |
---|---|---|---|
Next Message | Scott Marlowe | 2009-04-13 21:27:53 | Re: "PostgreSQL in the cloud" now up on media.postgresql.org |
Previous Message | Ivan Sergio Borgonovo | 2009-04-13 20:59:14 | Re: "PostgreSQL in the cloud" now up on media.postgresql.org |