Re: Query puts 7.3.4 on endless loop but 7.4beta5 is fine. [ with better indenting ] - Mailing list pgsql-performance

From Rajesh Kumar Mallah
Subject Re: Query puts 7.3.4 on endless loop but 7.4beta5 is fine. [ with better indenting ]
Date
Msg-id 200310301702.00275.mallah@trade-india.com
Whole thread Raw
In response to Query puts 7.3.4 on endless loop but 7.4beta5 is fine.  (<mallah@trade-india.com>)
Responses Re: Query puts 7.3.4 on endless loop but 7.4beta5 is fine. [ with better indenting ]
List pgsql-performance
Dear Tom,

Can you please have a Look at the below and suggest why it apparently puts
7.3.4 on an infinite loop . the CPU utilisation of the backend running it
approches 99%.


Query:

 I have tried my best to indent it :)

SELECT DISTINCT main.* FROM
(
   (
      (
         (
            Tickets main  JOIN Groups as Groups_1  ON ( main.id = Groups_1.Instance)
         )  JOIN
         Principals as Principals_2  ON ( Groups_1.id = Principals_2.ObjectId)
      ) JOIN
      CachedGroupMembers as CachedGroupMembers_3  ON ( Principals_2.id = CachedGroupMembers_3.GroupId)
   )  JOIN
   Users as Users_4  ON ( CachedGroupMembers_3.MemberId = Users_4.id)
)   WHERE

( (main.EffectiveId = main.id) ) AND
( (main.Type = 'ticket') ) AND

(
   (
      (
        (Users_4.EmailAddress = 'mallah_rajesh@yahoo.com')AND
        (Groups_1.Domain = 'RT::Ticket-Role')AND
        (Groups_1.Type = 'Requestor')AND
        (Principals_2.PrincipalType = 'Group')
      )
   )
   AND
   (
      (main.Status = 'new')OR(main.Status = 'open')
   )
)  ORDER BY main.Priority DESC LIMIT 10


On Thursday 30 Oct 2003 2:17 am, mallah@trade-india.com wrote:
> ok this time it constructs a query which puts 7.3.4 on a infinite loop
> but 7.4b5 is able to come out of it.
>
> since it may be of interest to the pgsql people i am Ccing it to the
> pgsql-performance list i hope its ok.
>
>
>
> Pgsql 7.3.4 on an endless loop:
>
> SELECT DISTINCT main.* FROM ((((Tickets main  JOIN Groups as Groups_1  ON (
> main.id = Groups_1.Instance))  JOIN Principals as Principals_2  ON (
> Groups_1.id = Principals_2.ObjectId)) JOIN CachedGroupMembers as
> CachedGroupMembers_3  ON ( Principals_2.id = CachedGroupMembers_3.GroupId))
>  JOIN Users as Users_4  ON ( CachedGroupMembers_3.MemberId = Users_4.id))
> WHERE ((main.EffectiveId = main.id)) AND ((main.Type = 'ticket')) AND ( (
> ( (Users_4.EmailAddress = 'mallah_rajesh@yahoo.com')AND(Groups_1.Domain =
> 'RT::Ticket-Role')AND(Groups_1.Type =
> 'Requestor')AND(Principals_2.PrincipalType = 'Group') )  ) AND (
> (main.Status = 'new')OR(main.Status = 'open') ) )  ORDER BY main.Priority
> DESC LIMIT 10
>
>
> But 7.4 beta5  seems to be able to handle it:
>
> SELECT DISTINCT main.* FROM ((((Tickets main  JOIN Groups as Groups_1  ON (
> main.id = Groups_1.Instance))  JOIN Principals as Principals_2  ON (
> Groups_1.id = Principals_2.ObjectId)) JOIN CachedGroupMembers as
> CachedGroupMembers_3  ON ( Principals_2.id = CachedGroupMembers_3.GroupId))
>  JOIN Users as Users_4  ON ( CachedGroupMembers_3.MemberId = Users_4.id))
> WHERE ((main.EffectiveId = main.id)) AND ((main.Type = 'ticket')) AND ( (
> ( (Users_4.EmailAddress = 'mallah_rajesh@yahoo.com')AND(Groups_1.Domain =
> 'RT::Ticket-Role')AND(Groups_1.Type =
> 'Requestor')AND(Principals_2.PrincipalType = 'Group') )  ) AND (
> (main.Status = 'new')OR(main.Status = 'open') ) )  ORDER BY main.Priority
> DESC LIMIT 10;  id  | effectiveid | queue |  type  | issuestatement |
> resolution | owner |         subject
>
>     | initialpriority | finalpriority | priority | timeestimated |
>     | timeworked | status | timeleft
>   |
>   | told |       starts        |       started       |         due
>   | |      resolved       |
>
>   lastupdatedby |     lastupdated     | creator |       created       |
> disabled------+-------------+-------+--------+----------------+------------
>+-------+-------------------------+-----------------+---------------+-------
>---+---------------+------------+--------+----------+------+----------------
>-----+---------------------+---------------------+---------------------+----
>-----------+---------------------+---------+---------------------+----------
>   13 |          13 |    23 | ticket |              0 |          0 | 31122 |
> General Discussion
>
>      |               0 |             0 |        0 |             0 |
>      |  0 | new    |        0
>      |
>    |      | 1970-01-01 00:00:00 | 1970-01-01 00:00:00 | 1970-01-01 00:00:00
>    |      | | 1970-01-01 00:00:00
>    |
>    |         31122 | 2001-11-22 04:19:10 |   31122 | 2001-11-22 04:19:07 |
>    |       0 6018 |        6018 |    19 | ticket |              0 |
>    |  0 |    10 | EYP Prospective
>
>  Clients |               0 |             0 |        0 |             0 |
>      0 | new    | 0 |      | 1970-01-01 00:00:00 | 1970-01-01 00:00:00 |
> 2002-09-11 18:29:37 | 1970-01-01 00:00:00 |         31122 | 2002-09-11
> 18:29:39 |   31122 | 2002-09-11 18:29:37 |        0 6336 |        6336 |
> 19 | ticket |              0 |          0 |    10 | EYP Prospective Clients
> |               0 |             0 |        0 |             0 |          0 |
> new    | 0 |      | 1970-01-01 00:00:00 | 1970-01-01 00:00:00 | 2002-09-20
> 12:31:02 | 1970-01-01 00:00:00 |         31122 | 2002-09-20 12:31:09 |
> 31122 | 2002-09-20 12:31:02 |        0 6341 |        6341 |    19 | ticket
> |              0 |          0 |    10 | IP Prospective Clients  |
>     0 |             0 |        0 |             0 |          0 | new    | 0
> |      | 1970-01-01 00:00:00 | 1970-01-01 00:00:00 | 2002-09-20 14:34:25 |
> 1970-01-01 00:00:00 |         31122 | 2002-09-20 14:34:26 |   31122 |
> 2002-09-20 14:34:25 |        0(4 rows)
>
> Time: 900.930 ms
>
>
>
> With The explain analyze below:
>
> rt3=# explain analyze  SELECT DISTINCT main.* FROM ((((Tickets main  JOIN
> Groups as Groups_1  ON ( main.id = Groups_1.Instance))  JOIN Principals as
> Principals_2  ON ( Groups_1.id = Principals_2.ObjectId))  JOIN
> CachedGroupMembers as CachedGroupMembers_3  ON ( Principals_2.id =
> CachedGroupMembers_3.GroupId))  JOIN Users as Users_4  ON (
> CachedGroupMembers_3.MemberId = Users_4.id))   WHERE ((main.EffectiveId =
> main.id)) AND ((main.Type = 'ticket')) AND ( (  ( (Users_4.EmailAddress =
> 'mallah_rajesh@yahoo.com')AND(Groups_1.Domain =
> 'RT::Ticket-Role')AND(Groups_1.Type =
> 'Requestor')AND(Principals_2.PrincipalType = 'Group') )  ) AND (
> (main.Status = 'new')OR(main.Status = 'open') ) )  ORDER BY main.Priority
> DESC LIMIT 10;
>
>                                                              QUERY
> PLAN-----------------------------------------------------------------------
>----------------------------------------------------------------------------
>----------------------------------------------------------------------------
>----------------------------------------------------------------------------
>----------------------------------------------------------------------------
>--------------------------------- Limit  (cost=582.27..582.34 rows=1
> width=164) (actual time=854.302..854.433 rows=4 loops=1) ->  Unique
> (cost=582.27..582.34 rows=1 width=164) (actual time=854.297..854.418 rows=4
> loops=1) ->  Sort  (cost=582.27..582.28 rows=1 width=164) (actual
> time=854.294..854.303 rows=8 loops=1)               Sort Key:
> main.priority, main.id, main.effectiveid, main.queue, main."type",
> main.issuestatement, main.resolution, main."owner", main.subject,
> main.initialpriority, main.finalpriority, main.timeestimated,
> main.timeworked, main.status, main.timeleft, main.told, main.starts,
> main.started, main.due, main.resolved, main.lastupdatedby,
> main.lastupdated, main.creator, main.created, main.disabled
> ->  Hash Join  (cost=476.18..582.26 rows=1 width=164) (actual
> time=853.025..854.056 rows=8 loops=1)                     Hash Cond:
> ("outer".groupid = "inner".id) ->  Nested Loop  (cost=0.00..105.97 rows=21
> width=4) (actual time=0.372..1.073 rows=37 loops=1)
>   ->  Index Scan using users4 on users users_4  (cost=0.00..3.99 rows=2
> width=4) (actual time=0.182..0.188 rows=1 loops=1)
>        Index Cond: ((emailaddress)::text = 'mallah_rajesh@yahoo.com'::text)
> ->  Index Scan using cachedgroupmembers2 on cachedgroupmembers
> cachedgroupmembers_3  (cost=0.00..50.81 rows=14 width=8) (actual
> time=0.165..0.703 rows=37 loops=1)                                 Index
> Cond: (cachedgroupmembers_3.memberid = "outer".id) ->  Hash
> (cost=476.17..476.17 rows=1 width=168) (actual time=852.267..852.267 rows=0
> loops=1)                           ->  Nested Loop  (cost=0.00..476.17
> rows=1 width=168) (actual time=0.684..842.401 rows=3209 loops=1)
>                      ->  Nested Loop  (cost=0.00..471.54 rows=1 width=168)
> (actual time=0.571..704.492 rows=3209 loops=1)
>          ->  Seq Scan on tickets main  (cost=0.00..465.62 rows=1 width=164)
> (actual time=0.212..87.100 rows=3209 loops=1)
>               Filter: ((effectiveid = id) AND (("type")::text =
> 'ticket'::text) AND (((status)::text = 'new'::text) OR ((status)::text =
> 'open'::text)))                                       ->  Index Scan using
> groups1 on groups groups_1 (cost=0.00..5.90 rows=1 width=12) (actual
> time=0.158..0.168 rows=1 loops=3209)
>      Index Cond: (((groups_1."domain")::text = 'RT::Ticket-Role'::text) AND
> (("outer".id)::text = (groups_1.instance)::text) AND
> ((groups_1."type")::text = 'Requestor'::text))
>    ->  Index Scan using principals2 on principals principals_2
> (cost=0.00..4.62 rows=1 width=8) (actual time=0.019..0.022 rows=1
> loops=3209)                                       Index Cond: ("outer".id =
> principals_2.objectid) Filter: ((principaltype)::text = 'Group'::text)
> Total runtime: 855.472 ms
> (22 rows)
>
> Time: 895.739 ms
> rt3=#
>
> > http://backpan.cpan.org/authors/id/J/JE/JESSE/DBIx-SearchBuilder-0.90.tar
> >.gz
> >
> > On Thu, Oct 30, 2003 at 01:57:31AM +0530, mallah@trade-india.com wrote:
> >> > On Thu, Oct 30, 2003 at 01:30:26AM +0530, mallah@trade-india.com wrote:
> >> >> Dear Jesse,
> >> >>
> >> >> I really want to add a Pg specific better query builder
> >> >> the generic one is messing with postgresql.
> >> >
> >> > I've removed the CC to ivan, to my knowledge, he has nothing to do
> >> > with SB these days anymore.
> >> >
> >> >> i think i have to work in :
> >> >> DBIx/SearchBuilder/Handle/Pg.pm
> >> >>
> >> >> i hope u read my recent emails to pgsql-performance list.
> >>
> >> Yes.
> >>
> >> > And I hope you read my reply. There _is_ a postgres specific query
> >> > builder. And there was a bug in 0.90 that caused a possible endless
> >> > loop. The bugfix disabled some of the optimization. If you can tell me
> >> > that 0.90 improves your performance (as it generated more correct
> >> > queries for pg) then we can work on just fixing the little bug.
> >>
> >> where is .90 ? i dont see it in
> >>
> >> http://www.fsck.com/pub/rt/devel/
> >>
> >>
> >> regds
> >> mallah.
> >>
> >> >> =====================================================================
> >> >>============== # this code is all hacky and evil. but people
> >> >> desperately want _something_ and I'm # super tired. refactoring
> >> >> gratefully appreciated.
> >> >> =====================================================================
> >> >>==============
> >> >>
> >> >> sub _BuildJoins {
> >> >>     my $self = shift;
> >> >>     my $sb   = shift;
> >> >>     my %seen_aliases;
> >> >>
> >> >>     $seen_aliases{'main'} = 1;
> >> >>
> >> >>     my $join_clause =$sb->{'table'} . " main " ;
> >> >>
> >> >>     my @keys = ( keys %{ $sb->{'left_joins'} } );
> >> >>
> >> >>     while ( my $join = shift @keys ) {
> >> >>         if ( $seen_aliases{ $sb->{'left_joins'}{$join}{'depends_on'}
> >> >> } ) { $join_clause  = "(" . $join_clause;
> >> >>             $join_clause .=
> >> >> $sb->{'left_joins'}{$join}{'alias_string'} . " ON ("; $join_clause .=
> >> >>               join ( ') AND( ', values %{
> >> >> $sb->{'left_joins'}{$join}{'criteria'} } ); $join_clause .= ")) ";
> >> >>
> >> >>             $seen_aliases{$join} = 1;
> >> >>         }
> >> >>         else {
> >> >>             push ( @keys, $join );
> >> >>         }
> >> >>
> >> >>     }
> >> >>     return (
> >> >>                     join ( ", ", ($join_clause, @{ $sb->{'aliases'}
> >> >> }))) ;
> >> >>
> >> >> }
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> -----------------------------------------
> >> >> Over 1,00,000 exporters are waiting for your order! Click below to
> >> >> get in touch with leading Indian exporters listed in the premier
> >> >> trade directory Exporters Yellow Pages.
> >> >> http://www.trade-india.com/dyn/gdh/eyp/
> >> >
> >> > --
> >> > jesse reed vincent -- root@eruditorum.org -- jesse@fsck.com
> >> > 70EBAC90: 2A07 FC22 7DB4 42C1 9D71 0108 41A3 3FB3 70EB AC90
> >> >
> >> > . . . when not in doubt, get in doubt.  -- Old Discordian Proveb
> >>
> >> -----------------------------------------
> >> Over 1,00,000 exporters are waiting for your order! Click below to get
> >> in touch with leading Indian exporters listed in the premier
> >> trade directory Exporters Yellow Pages.
> >> http://www.trade-india.com/dyn/gdh/eyp/
> >
> > --
> > jesse reed vincent -- root@eruditorum.org -- jesse@fsck.com
> > 70EBAC90: 2A07 FC22 7DB4 42C1 9D71 0108 41A3 3FB3 70EB AC90
> >
> > . . . when not in doubt, get in doubt.  -- Old Discordian Proveb
>
> -----------------------------------------
> Over 1,00,000 exporters are waiting for your order! Click below to get
> in touch with leading Indian exporters listed in the premier
> trade directory Exporters Yellow Pages.
> http://www.trade-india.com/dyn/gdh/eyp/
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend


pgsql-performance by date:

Previous
From: Rajesh Kumar Mallah
Date:
Subject: Re: PostgreSQL 7.4beta5 vs MySQL 4.0.16 with RT(DBIx::SearchBuilder)
Next
From: "Cestmir Hybl"
Date:
Subject: Re: Ignoring index on (A is null), (A is not null) conditions