Re: Seeing foreign key lookups in explain output

From: Andreas Kretschmer <akretschmer(at)spamfence(dot)net>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: Seeing foreign key lookups in explain output
Date: 2011-09-20 15:20:55
Message-ID: 20110920152055.GA4449@tux
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Marti Raudsepp <marti(at)juffo(dot)org> wrote:

> On Tue, Sep 20, 2011 at 16:12, Marti Raudsepp <marti(at)juffo(dot)org> wrote:
> > On Tue, Sep 20, 2011 at 15:35, Vincent de Phily
> > <vincent(dot)dephily(at)mobile-devices(dot)fr> wrote:
> >> The explain output will tell me it's using the index on t1's id, but it tells
> >> me nothing about the seqscan that happens on t2 (because I forgot to add an
> >> index on t2.ref).
> >
> > +1 for a TODO on adding foreign key trigger time to EXPLAIN ANALYZE output.
>
> Sorry, that was too hasty. We already have that now in 9.0 and 9.1
> (not sure when it was introduced)
>
> create table a as select generate_series(1,10000) i;
> create table b as select generate_series(1,10000) i;
> alter table a add primary key (i);
> alter table b add foreign key (i) references a (i) on delete cascade;
> explain analyze delete from a;
>
> QUERY PLAN
> -----------------------------------------------------------------------------------------------------------
> Delete (cost=0.00..145.00 rows=10000 width=6) (actual
> time=16.308..16.308 rows=0 loops=1)
> -> Seq Scan on a (cost=0.00..145.00 rows=10000 width=6) (actual
> time=0.008..2.208 rows=10000 loops=1)
> Trigger for constraint b_i_fkey: time=6324.652 calls=10000
> Total runtime: 6342.406 ms
>
> Notice the line "Trigger for constraint b_i_fkey"

Unfortunately, there is no information about the plan for the trigger.
With extra index:

test=*# create index idx_b on b(i);
CREATE INDEX
Time: 10,645 ms
test=*# explain analyze delete from a;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------
Delete on a (cost=0.00..140.00 rows=10000 width=6) (actual time=18.881..18.881 rows=0 loops=1)
-> Seq Scan on a (cost=0.00..140.00 rows=10000 width=6) (actual time=0.015..3.800 rows=10000 loops=1)
Trigger for constraint b_i_fkey: time=231.084 calls=10000
Total runtime: 254.033 ms

without index:

test=*# explain analyze delete from a;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------
Delete on a (cost=0.00..140.00 rows=10000 width=6) (actual time=19.090..19.090 rows=0 loops=1)
-> Seq Scan on a (cost=0.00..140.00 rows=10000 width=6) (actual time=0.014..3.868 rows=10000 loops=1)
Trigger for constraint b_i_fkey: time=9823.762 calls=10000
Total runtime: 9846.789 ms
(4 rows)

The same plan, but not the same execution time. Bad...
(version ist 9.1.0)

Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect. (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly." (unknown)
Kaufbach, Saxony, Germany, Europe. N 51.05082°, E 13.56889°

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2011-09-20 15:36:15 Re: extensions in 9.1
Previous Message Scott Marlowe 2011-09-20 15:13:46 Re: upgrade postgres to 8.4.8, centos 5.3