Search Postgresql Archives

Re: [ADMIN] Planner picking topsey turvey plan?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Explain analyze below, 


DB=# explain analyze select a.artist, a.date, b.mult_ref, b.items, b.parts from (show a inner join orders b on a.code = b.show) where artist = 'ALKALINE TRIO';                                                                      QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------
 Hash Join  (cost=1583955.94..1794350.36 rows=1552 width=70) (actual time=231496.678..243243.711 rows=892 loops=1)
   Hash Cond: (a.show = a.code)
   ->  GroupAggregate  (cost=1583418.91..1737354.68 rows=4104954 width=40) (actual time=223204.620..241813.067 rows=2856379 loops=1)
         ->  Sort  (cost=1583418.91..1593681.29 rows=4104954 width=40) (actual time=223204.567..231296.896 rows=4104964 loops=1)
               Sort Key: b.mult_ref, a.show
               Sort Method:  external merge  Disk: 224328kB
               ->  Hash Left Join  (cost=321999.38..795776.58 rows=4104954 width=40) (actual time=14850.320..165804.778 rows=4104964 loops=1)
                     Hash Cond: (a.transno = b.transno)
                     ->  Seq Scan on credit a  (cost=0.00..268740.54 rows=4104954 width=31) (actual time=7.563..76901.901 rows=4104954 loops=1)
                     ->  Hash  (cost=160885.28..160885.28 rows=8775528 width=18) (actual time=14831.810..14831.810 rows=8775528 loops=1)
                           ->  Seq Scan on mult_ord b  (cost=0.00..160885.28 rows=8775528 width=18) (actual time=4.716..4952.254 rows=8775528 loops=1)
   ->  Hash  (cost=535.28..535.28 rows=140 width=26) (actual time=228.599..228.599 rows=54 loops=1)
         ->  Bitmap Heap Scan on show a  (cost=9.49..535.28 rows=140 width=26) (actual time=77.723..228.488 rows=54 loops=1)
               Recheck Cond: ((artist)::text = 'ALKALINE TRIO'::text)
               ->  Bitmap Index Scan on show_index07  (cost=0.00..9.46 rows=140 width=0) (actual time=62.228..62.228 rows=54 loops=1)
                     Index Cond: ((artist)::text = 'ALKALINE TRIO'::text)
 Total runtime: 243367.640 ms



--- On Sat, 6/12/08, Scott Marlowe <scott.marlowe@xxxxxxxxx> wrote:

> From: Scott Marlowe <scott.marlowe@xxxxxxxxx>
> Subject: Re: [ADMIN]  Planner picking topsey turvey plan?
> To: glynastill@xxxxxxxxxxx
> Cc: pgsql-general@xxxxxxxxxxxxxx, pgsql-admin@xxxxxxxxxxxxxx
> Date: Saturday, 6 December, 2008, 8:35 PM
> what does explain analyze yourqueryhere say?
> 
> On Sat, Dec 6, 2008 at 1:33 PM, Glyn Astill
> <glynastill@xxxxxxxxxxx> wrote:
> > Anyone?
> >
> >
> > --- On Fri, 5/12/08, Glyn Astill
> <glynastill@xxxxxxxxxxx> wrote:
> >
> >> From: Glyn Astill <glynastill@xxxxxxxxxxx>
> >> Subject:  Planner picking topsey turvey
> plan?
> >> To: pgsql-general@xxxxxxxxxxxxxx
> >> Date: Friday, 5 December, 2008, 2:23 PM
> >> Hi people,
> >>
> >> Does anyone know how I can change what I'm
> doing to get
> >> pgsql to pick a better plan?
> >>
> >> I'll explain what I've done below but
> please
> >> forgive me if I interpret the plans wrong as I try
> to
> >> describe, I've split it into 4 points to try
> and ease
> >> the mess of pasting in the plans..
> >>
> >>
> >> 1) I've created a view "orders" that
> joins
> >> two tables "credit" and
> "mult_ord"
> >> together as below:
> >>
> >> CREATE VIEW orders AS
> >>   SELECT b.mult_ref, a.show, MIN(a.transno) AS
> >> "lead_transno", COUNT(a.transno) AS
> >> "parts", SUM(a.tickets) AS
> "items",
> >> SUM(a.value) AS "value"
> >>   FROM (credit a LEFT OUTER JOIN mult_ord b ON
> a.transno =
> >> b.transno)
> >>   GROUP BY b.mult_ref, a.show;
> >>
> >>
> >>
> >> 2) And an explain on that view comes out as below,
> it's
> >> using the correct index for the field show on
> >> "credit" which doesn't look too bad
> to me:
> >>
> >> DB=# explain select a.artist, a.date, b.mult_ref,
> b.items,
> >> b.parts from (show a inner join orders b on a.code
> = b.show)
> >> where b.show = 357600;
> >>                                               
> QUERY PLAN
> >>
> --------------------------------------------------------------------------------------------------------
> >>  Nested Loop  (cost=15050.79..15099.68 rows=1013
> width=70)
> >>    ->  Index Scan using show_index01 on show a
> >> (cost=0.00..8.37 rows=1 width=26)
> >>          Index Cond: (code = 357600::numeric)
> >>    ->  HashAggregate  (cost=15050.79..15071.05
> rows=1013
> >> width=39)
> >>          ->  Nested Loop Left Join 
> (cost=0.00..15035.60
> >> rows=1013 width=39)
> >>                ->  Index Scan using
> credit_index04 on
> >> credit a  (cost=0.00..4027.30 rows=1013 width=31)
> >>                      Index Cond: (show =
> 357600::numeric)
> >>                ->  Index Scan using
> mult_ord_index02 on
> >> mult_ord b  (cost=0.00..10.85 rows=1 width=17)
> >>                      Index Cond: (a.transno =
> b.transno)
> >> (9 rows)
> >>
> >>
> >>
> >> 3) Then I have a table called "show"
> that is
> >> indexed on the artist field, and a plan for
> listing the
> >> shows for an artist is as below, again this
> doesn't look
> >> too bad to me, as it's using the index on
> artist.
> >>
> >> DB=# explain select * from show where artist =
> >> 'ALKALINE TRIO';
> >>                                  QUERY PLAN
> >>
> -----------------------------------------------------------------------------
> >>  Bitmap Heap Scan on show  (cost=9.59..582.41
> rows=153
> >> width=348)
> >>    Recheck Cond: ((artist)::text = 'ALKALINE
> >> TRIO'::text)
> >>    ->  Bitmap Index Scan on show_index07
> >> (cost=0.00..9.56 rows=153 width=0)
> >>          Index Cond: ((artist)::text =
> 'ALKALINE
> >> TRIO'::text)
> >> (4 rows)
> >>
> >>
> >>
> >> 4) So.. I guess I can join "show" ->
> >> "orders", expecting an index scan on
> >> "show" for the artist, then an index
> scan on
> >> "orders" for each show.
> >>
> >> However it seems the planner has other ideas, it
> just looks
> >> backwards to me:
> >>
> >> DB=# explain select a.artist, a.date, b.mult_ref,
> b.items,
> >> b.parts from (show a inner join orders b on a.code
> = b.show)
> >> where artist = 'ALKALINE TRIO';
> >>                                              QUERY
> PLAN
> >>
> ----------------------------------------------------------------------------------------------------
> >>  Hash Join  (cost=1576872.96..1786175.37 rows=1689
> >> width=70)
> >>    Hash Cond: (a.show = a.code)
> >>    ->  GroupAggregate 
> (cost=1576288.64..1729424.39
> >> rows=4083620 width=39)
> >>          ->  Sort  (cost=1576288.64..1586497.69
> >> rows=4083620 width=39)
> >>                Sort Key: b.mult_ref, a.show
> >>                ->  Hash Left Join
> >> (cost=321406.05..792886.22 rows=4083620 width=39)
> >>                      Hash Cond: (a.transno =
> b.transno)
> >>                      ->  Seq Scan on credit a
> >> (cost=0.00..267337.20 rows=4083620 width=31)
> >>                      ->  Hash
> >> (cost=160588.80..160588.80 rows=8759380 width=17)
> >>                            ->  Seq Scan on
> mult_ord b
> >> (cost=0.00..160588.80 rows=8759380 width=17)
> >>    ->  Hash  (cost=582.41..582.41 rows=153
> width=26)
> >>          ->  Bitmap Heap Scan on show a
> >> (cost=9.59..582.41 rows=153 width=26)
> >>                Recheck Cond: ((artist)::text =
> >> 'ALKALINE TRIO'::text)
> >>                ->  Bitmap Index Scan on
> show_index07
> >> (cost=0.00..9.56 rows=153 width=0)
> >>                      Index Cond: ((artist)::text =
> >> 'ALKALINE TRIO'::text)
> >> (15 rows)
> >>
> >> Any idea if I can get around this?
> >>
> >>
> >>
> >>
> >>
> >>
> >> --
> >> Sent via pgsql-general mailing list
> >> (pgsql-general@xxxxxxxxxxxxxx)
> >> To make changes to your subscription:
> >> http://www.postgresql.org/mailpref/pgsql-general
> >
> >
> >
> >
> > --
> > Sent via pgsql-admin mailing list
> (pgsql-admin@xxxxxxxxxxxxxx)
> > To make changes to your subscription:
> > http://www.postgresql.org/mailpref/pgsql-admin
> >
> 
> 
> 
> -- 
> When fascism comes to America, it will be draped in a flag
> and
> carrying a cross - Sinclair Lewis
> 
> -- 
> Sent via pgsql-general mailing list
> (pgsql-general@xxxxxxxxxxxxxx)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general




-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux