Re: left outer join terrible slow compared to inner join - Mailing list pgsql-general

From Clay Luther
Subject Re: left outer join terrible slow compared to inner join
Date
Msg-id F67EB38120F7BB4BB972C786095802070E33AD@ipcbu-exchange.amer.unity.cisco.com
Whole thread Raw
In response to left outer join terrible slow compared to inner join  (Thomas Beutin <tyrone@laokoon.IN-Berlin.DE>)
Responses Re: left outer join terrible slow compared to inner join  (Greg Stark <gsstark@mit.edu>)
Re: left outer join terrible slow compared to inner join  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general
Interstingly enough, the EXPLAIN ANALYZE itself took 90+ seconds:

claycle@gkar:.../PhoneInserter/PhoneInserter > time psql -f e_stationd.sql ccm > analyzed.txt

real    1m46.770s
user    0m0.010s
sys     0m0.010s

Here is the output of the above explain analyze execution:


                                                 QUERY PLAN
                                                                                                              

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Sort  (cost=17157472946.49..17157472949.56 rows=1229 width=2066) (actual time=106513.59..106515.67 rows=1780 loops=1)
   Sort Key: d.name
   ->  Nested Loop  (cost=1.15..17157472883.44 rows=1229 width=2066) (actual time=2724.18..106407.50 rows=1780 loops=1)
         Join Filter: ("outer".fkcallingsearchspace = "inner".pkid)
         ->  Nested Loop  (cost=1.15..17157470797.64 rows=1229 width=1976) (actual time=2723.56..104804.55 rows=1780
loops=1)
               Join Filter: (("inner".tkservice = 11) AND ("inner".paramname = 'DefaultNetworkLocale'::character
varying))
               ->  Nested Loop  (cost=1.15..17157452120.74 rows=1229 width=1941) (actual time=2721.32..97560.43
rows=1780loops=1) 
                     Join Filter: (("inner".tkservice = 11) AND ("inner".paramname = 'DefaultUserLocale'::character
varying))
                     ->  Nested Loop  (cost=1.15..17157433443.83 rows=1229 width=1906) (actual time=2719.93..90288.85
rows=1780loops=1) 
                           Join Filter: (("inner".tkservice = 11) AND ("inner".paramname =
'MLPPDomainIdentifier'::charactervarying)) 
                           ->  Nested Loop  (cost=1.15..17157414766.93 rows=1229 width=1871) (actual
time=2717.94..83141.71rows=1780 loops=1) 
                                 Join Filter: (("inner".tkservice = 11) AND ("inner".paramname =
'MLPPPreemptionSetting'::charactervarying)) 
                                 ->  Nested Loop  (cost=1.15..17157396090.02 rows=1229 width=1836) (actual
time=2714.90..76002.08rows=1780 loops=1) 
                                       Join Filter: (("inner".tkservice = 11) AND ("inner".paramname =
'MLPPIndicationStatus'::charactervarying)) 
                                       ->  Nested Loop  (cost=1.15..17157377413.11 rows=1229 width=1801) (actual
time=2712.05..68810.87rows=1780 loops=1) 
                                             Join Filter: ((("outer".fkvoicemessagingpilot IS NULL) OR
("outer".fkvoicemessagingpilot= "inner".pkid)) AND (("inner".isdefault = true) OR ("outer".fkvoicemessagingpilot =
"inner".pkid)))
                                             ->  Nested Loop  (cost=1.15..17157376083.00 rows=1229 width=1759) (actual
time=2711.44..68020.45rows=1780 loops=1) 
                                                   Join Filter: ((("outer".fkvoicemessagingprofile IS NULL) OR
("outer".fkvoicemessagingprofile= "inner".pkid)) AND (("inner".isdefault = true) OR ("outer".fkvoicemessagingprofile =
"inner".pkid)))
                                                   ->  Nested Loop  (cost=1.15..17157375032.94 rows=946 width=1722)
(actualtime=2710.83..67240.60 rows=1780 loops=1) 
                                                         Join Filter: ("outer".fkroutefilter = "inner".pkid)
                                                         ->  Nested Loop  (cost=1.15..17157373703.81 rows=946
width=1623)(actual time=2710.21..66328.33 rows=1780 loops=1) 
                                                               Join Filter: ("outer".fkdialplan = "inner".pkid)
                                                               ->  Nested Loop  (cost=1.15..17157372736.52 rows=946
width=1599)(actual time=2709.74..65695.13 rows=1780 loops=1) 
                                                                     Join Filter: ("outer".fkdigitdiscardinstruction =
"inner".pkid)
                                                                     ->  Nested Loop  (cost=1.15..17157370184.69
rows=946width=1579) (actual time=2709.01..64628.50 rows=1780 loops=1) 
                                                                           Join Filter: ("outer".fkcallmanager =
"inner".pkid)
                                                                           ->  Nested Loop  (cost=1.15..17157369196.12
rows=946width=1563) (actual time=2708.58..63948.35 rows=1780 loops=1) 
                                                                                 Join Filter:
("inner".fkcallmanagergroup= "outer".pkid) 
                                                                                 ->  Nested Loop
(cost=1.15..17157368659.26rows=473 width=1531) (actual time=2708.13..63271.44 rows=890 loops=1) 
                                                                                       Join Filter:
("outer".fkcallmanagergroup= "inner".pkid) 
                                                                                       ->  Nested Loop
(cost=1.15..17157368154.34rows=473 width=1515) (actual time=2707.69..62936.58 rows=890 loops=1) 
                                                                                             Join Filter:
("outer".fkmediaresourcelist= "inner".pkid) 
                                                                                             ->  Nested Loop
(cost=1.15..17157367660.05rows=473 width=1499) (actual time=2707.29..62613.05 rows=890 loops=1) 
                                                                                                   Join Filter:
("outer".fkdevicepool= "inner".pkid) 
                                                                                                   ->  Nested Loop
(cost=1.15..17157366235.14rows=473 width=1431) (actual time=2706.54..61664.68 rows=890 loops=1) 
                                                                                                         Join Filter:
("outer".fkcallingsearchspace_translation= "inner".pkid) 
                                                                                                         ->  Nested
Loop (cost=1.15..17157365432.22 rows=473 width=1341) (actual time=2705.92..61180.46 rows=890 loops=1) 
                                                                                                               Join
Filter:("outer".fkcallingsearchspace_sharedlineappear = "inner".pkid) 
                                                                                                               ->
NestedLoop  (cost=1.15..17157364629.30 rows=473 width=1251) (actual time=2705.19..60567.86 rows=890 loops=1) 

JoinFilter: ("outer".fkroutepartition = "inner".pkid) 
                                                                                                                     ->
Nested Loop  (cost=1.15..17157363751.89 rows=473 width=1221) (actual time=2704.59..59883.81 rows=890 loops=1) 

  Join Filter: ("outer".fknumplan = "inner".pkid) 

  ->  Nested Loop  (cost=1.15..17157345954.08 rows=473 width=605) (actual time=2691.46..32912.02 rows=890 loops=1) 

        Join Filter: ("outer".pkid = "inner".fkdevice) 

        ->  Nested Loop  (cost=1.15..17157317358.59 rows=462 width=504) (actual time=2657.87..5239.00 rows=808 loops=1) 

              Join Filter: ("outer".fkmediaresourcelist = "inner".pkid) 

              ->  Hash Join  (cost=1.15..17157316875.80 rows=462 width=472) (actual time=2657.66..5139.98 rows=808
loops=1)

                    Hash Cond: ("outer".tkdeviceprotocol = "inner".enum) 

                    ->  Nested Loop  (cost=0.00..17157316866.57 rows=462 width=452) (actual time=2656.96..5062.74
rows=808loops=1) 

                          Join Filter: ("outer".fklocation = "inner".pkid) 

                          ->  Nested Loop  (cost=0.00..17157316860.79 rows=462 width=432) (actual time=2656.88..4992.47
rows=808loops=1) 

                                Join Filter: ("outer".fkcallingsearchspace_aar = "inner".pkid) 

                                ->  Nested Loop  (cost=0.00..17157316076.55 rows=462 width=342) (actual
time=2656.46..4706.90rows=808 loops=1) 

                                      Join Filter: ("outer".fkcallingsearchspace = "inner".pkid) 

                                      ->  Seq Scan on device d  (cost=0.00..17157315292.30 rows=462 width=252) (actual
time=2655.97..4380.22rows=808 loops=1) 

                                            Filter: ((tkdeviceprofile = 0) AND (subplan)) 

                                            SubPlan 

                                              ->  Materialize  (cost=12307973.61..12307973.61 rows=40 width=145)
(actualtime=2.87..3.44 rows=455 loops=924) 

                                                    ->  Unique  (cost=0.00..12307973.61 rows=40 width=145) (actual
time=803.51..2650.40rows=808 loops=1) 

                                                          ->  Nested Loop  (cost=0.00..12307972.62 rows=396 width=145)
(actualtime=803.50..2645.21 rows=808 loops=1) 

                                                                Join Filter: ("outer".fkcallmanager = "inner".pkid) 

                                                                Filter: ("inner".name = 'DAL-CCM2'::character varying) 

                                                                ->  Nested Loop  (cost=0.00..12307556.90 rows=396
width=116)(actual time=803.38..2603.11 rows=808 loops=1) 

                                                                      Join Filter: ("inner".fkcallmanagergroup =
"outer".pkid)

                                                                      Filter: ("inner".priority = 0) 

                                                                      ->  Nested Loop  (cost=0.00..12307101.59 rows=396
width=80)(actual time=803.23..2540.22 rows=808 loops=1) 

                                                                            Join Filter: ("outer".fkcallmanagergroup =
"inner".pkid)

                                                                            ->  Nested Loop  (cost=0.00..12306678.94
rows=396width=64) (actual time=803.12..2505.12 rows=808 loops=1) 

                                                                                  Join Filter: ("outer".fkdevicepool =
"inner".pkid)

                                                                                  ->  Index Scan using device_pkey on
deviced  (cost=0.00..12305486.23 rows=396 width=32) (actual time=802.92..2160.98 rows=808 loops=1) 

                                                                                        Filter: (((tkclass = 1) OR
(tkclass= 10)) AND (subplan)) 

                                                                                        SubPlan 

                                                                                          ->  Materialize
(cost=8827.26..8827.26rows=1394 width=145) (actual time=0.99..1.55 rows=451 loops=810) 

                                                                                                ->  Nested Loop
(cost=0.00..8827.26rows=1394 width=145) (actual time=1.44..799.37 rows=898 loops=1) 

                                                                                                      Join Filter:
("outer".fkcallmanager= "inner".pkid) 

                                                                                                      Filter:
("inner".name= 'DAL-SJ-CCM3'::character varying) 

                                                                                                      ->  Nested Loop
(cost=0.00..7363.56rows=1394 width=116) (actual time=1.30..750.11 rows=898 loops=1) 

                                                                                                            Join
Filter:("inner".fkcallmanagergroup = "outer".pkid) 

                                                                                                            Filter:
("inner".priority<> 0) 

                                                                                                            ->  Nested
Loop (cost=0.00..5760.46 rows=1394 width=80) (actual time=0.76..655.61 rows=1394 loops=1) 

                                                                                                                  Join
Filter:("outer".fkcallmanagergroup = "inner".pkid) 

                                                                                                                  ->
NestedLoop  (cost=0.00..4272.37 rows=1394 width=64) (actual time=0.62..597.83 rows=1394 loops=1) 


JoinFilter: ("outer".fkdevicepool = "inner".pkid) 


-> Seq Scan on device d  (cost=0.00..72.94 rows=1394 width=32) (actual time=0.02..11.42 rows=1394 loops=1) 


-> Seq Scan on devicepool dp  (cost=0.00..2.45 rows=45 width=32) (actual time=0.01..0.28 rows=45 loops=1394) 

                                                                                                                  ->
SeqScan on callmanagergroup cmg  (cost=0.00..1.03 rows=3 width=16) (actual time=0.01..0.02 rows=3 loops=1394) 

                                                                                                            ->  Seq
Scanon callmanagergroupmember gm  (cost=0.00..1.06 rows=6 width=36) (actual time=0.01..0.04 rows=6 loops=1394) 

                                                                                                      ->  Seq Scan on
callmanagercm  (cost=0.00..1.02 rows=2 width=29) (actual time=0.01..0.02 rows=2 loops=898) 

                                                                                  ->  Seq Scan on devicepool dp
(cost=0.00..2.45rows=45 width=32) (actual time=0.01..0.28 rows=45 loops=808) 

                                                                            ->  Seq Scan on callmanagergroup cmg
(cost=0.00..1.03rows=3 width=16) (actual time=0.01..0.02 rows=3 loops=808) 

                                                                      ->  Seq Scan on callmanagergroupmember gm
(cost=0.00..1.06rows=6 width=36) (actual time=0.01..0.04 rows=6 loops=808) 

                                                                ->  Seq Scan on callmanager cm  (cost=0.00..1.02 rows=2
width=29)(actual time=0.01..0.02 rows=2 loops=808) 

                                      ->  Seq Scan on callingsearchspace cs  (cost=0.00..1.31 rows=31 width=90) (actual
time=0.01..0.21rows=31 loops=808) 

                                ->  Seq Scan on callingsearchspace aarcs  (cost=0.00..1.31 rows=31 width=90) (actual
time=0.01..0.18rows=31 loops=808) 

                          ->  Seq Scan on "location" l  (cost=0.00..0.00 rows=1 width=20) (actual time=0.00..0.00
rows=0loops=808) 

                    ->  Hash  (cost=1.12..1.12 rows=12 width=20) (actual time=0.16..0.16 rows=0 loops=1) 

                          ->  Seq Scan on typedeviceprotocol p  (cost=0.00..1.12 rows=12 width=20) (actual
time=0.05..0.11rows=12 loops=1) 

              ->  Seq Scan on mediaresourcelist ol  (cost=0.00..1.02 rows=2 width=32) (actual time=0.01..0.02 rows=2
loops=808)

        ->  Seq Scan on devicenumplanmap dnp  (cost=0.00..43.62 rows=1462 width=101) (actual time=0.03..27.03 rows=1462
loops=808)

  ->  Seq Scan on numplan np  (cost=0.00..28.39 rows=739 width=616) (actual time=0.05..23.73 rows=739 loops=890) 
                                                                                                                     ->
Seq Scan on routepartition rp  (cost=0.00..1.38 rows=38 width=30) (actual time=0.02..0.24 rows=38 loops=890) 
                                                                                                               ->  Seq
Scanon callingsearchspace css  (cost=0.00..1.31 rows=31 width=90) (actual time=0.01..0.21 rows=31 loops=890) 
                                                                                                         ->  Seq Scan
oncallingsearchspace cst  (cost=0.00..1.31 rows=31 width=90) (actual time=0.01..0.19 rows=31 loops=890) 
                                                                                                   ->  Seq Scan on
devicepooldp  (cost=0.00..2.45 rows=45 width=68) (actual time=0.03..0.61 rows=45 loops=890) 
                                                                                             ->  Seq Scan on
mediaresourcelistdl  (cost=0.00..1.02 rows=2 width=16) (actual time=0.01..0.02 rows=2 loops=890) 
                                                                                       ->  Seq Scan on callmanagergroup
cmg (cost=0.00..1.03 rows=3 width=16) (actual time=0.01..0.03 rows=3 loops=890) 
                                                                                 ->  Seq Scan on callmanagergroupmember
gm (cost=0.00..1.06 rows=6 width=32) (actual time=0.01..0.05 rows=6 loops=890) 
                                                                           ->  Seq Scan on callmanager cm
(cost=0.00..1.02rows=2 width=16) (actual time=0.01..0.02 rows=2 loops=1780) 
                                                                     ->  Seq Scan on digitdiscardinstruction ddi
(cost=0.00..2.31rows=31 width=20) (actual time=0.01..0.18 rows=31 loops=1780) 
                                                               ->  Seq Scan on dialplan dlp  (cost=0.00..1.01 rows=1
width=24)(actual time=0.01..0.02 rows=1 loops=1780) 
                                                         ->  Seq Scan on routefilter rf  (cost=0.00..1.18 rows=18
width=99)(actual time=0.01..0.12 rows=18 loops=1780) 
                                                   ->  Seq Scan on voicemessagingprofile vm  (cost=0.00..1.04 rows=4
width=37)(actual time=0.02..0.05 rows=4 loops=1780) 
                                             ->  Seq Scan on voicemessagingpilot vmp  (cost=0.00..1.03 rows=3 width=42)
(actualtime=0.02..0.04 rows=3 loops=1780) 
                                       ->  Seq Scan on processconfig pc  (cost=0.00..9.68 rows=368 width=35) (actual
time=0.02..2.49rows=368 loops=1780) 
                                 ->  Seq Scan on processconfig pcc  (cost=0.00..9.68 rows=368 width=35) (actual
time=0.02..2.45rows=368 loops=1780) 
                           ->  Seq Scan on processconfig pcd  (cost=0.00..9.68 rows=368 width=35) (actual
time=0.02..2.42rows=368 loops=1780) 
                     ->  Seq Scan on processconfig pcf  (cost=0.00..9.68 rows=368 width=35) (actual time=0.02..2.45
rows=368loops=1780) 
               ->  Seq Scan on processconfig pcg  (cost=0.00..9.68 rows=368 width=35) (actual time=0.02..2.43 rows=368
loops=1780)
         ->  Seq Scan on callingsearchspace cssv  (cost=0.00..1.31 rows=31 width=90) (actual time=0.02..0.24 rows=31
loops=1780)
 Total runtime: 106530.61 msec
(120 rows)


> -----Original Message-----
> From: Sean Chittenden [mailto:sean@chittenden.org]
> Sent: Thursday, August 28, 2003 1:32 PM
> To: Clay Luther
> Cc: pgsql-general@postgresql.org
> Subject: Re: [GENERAL] left outer join terrible slow compared to inner
> join
>
>
> > Actually, I was about to post some problems we have with large left
> > outer joins as well we've discovered in a porting project from
> > NT/SQL Server -> Linux/Postgres.
> >
> > We have a particular query that is rather large, left outer joining
> > across several tables.  Under SQL Server, with identical data and
> > schema, this particular query takes 2 seconds.
> >
> > Under PostgreSQL, this same query takes 90 seconds -- that's right,
> > 90 seconds.  45x longer than SQL Server.  This was quite a shock to
> > us (we'd not seen such a performance deficit between the two dbs
> > until this) and could, in fact, force us away from Postgres.
> >
> > I'd be happy to forward the explain to anyone who'd care to look at
> > it...
>
> Post an EXPLAIN ANALYZE of the query...
>
> -sc
>
> --
> Sean Chittenden
>

pgsql-general by date:

Previous
From: Sean Chittenden
Date:
Subject: Re: left outer join terrible slow compared to inner join
Next
From: Stephen Frost
Date:
Subject: Re: left outer join terrible slow compared to inner join