Hi, using RT 4.0.2 and DBIx::SearchBuilder 1.61 (also tested 1.59) I can reliably create a search using the RT4 GUI that locks up the database.

It appears that the search used to generate the 'Found X tickets' text generates a large set of joins which murders MySQL :(

The query is a simple search with a created-date and 9 Requestor.EmailAddress' to check. See attached rt-attr.txt. Note that the dataset the query returns is only 72 tickets.

The count query generated for this has 10 full joins and 9 left joins. See attached doom.sql, which I have manually formatted for easier reading. It was generated by SearchBuilder 1.61; explain shows it hitting 43K rows. SearchBuilder 1.59 is even more inefficient and is hitting 53K rows. It has more joins and less left joins, but about the same number in total.

Attached is what I believe is an equivalent count statement (clean.sql) which hits 9 rows.

The original query was created in RT3 and according to the user didn't have any problem running. Certainly any effect was limited enough that none of the sys-admins noticed it running. In RT4 however, with much newer SearchBuilder, it gets a lot of table locks in thee DB and prevents anyone from doing anything, which leads to 500 errors.

Any help is much appreciated.

Cheers, Jeff.
explain SELECT COUNT(DISTINCT main.id) FROM Tickets main
      JOIN Groups Groups_1 ON ( Groups_1.Domain = 'RT::Ticket-Role' ) AND ( 
Groups_1.Type = 'Requestor' ) AND ( Groups_1.Instance = main.id ) 
      JOIN CachedGroupMembers CachedGroupMembers_18  ON 
(CachedGroupMembers_18.GroupId = Groups_1.id ) 
 LEFT JOIN Users Users_3  ON ( Users_3.id = CachedGroupMembers_18.MemberId )
WHERE
(  main.Status != 'deleted' )
AND (
      main.Created > '2010-08-31 14:00:00'
      AND (
            ( Users_3.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_3.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_3.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_3.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_3.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_3.EmailAddress = 'us...@redhat.com' )  
        OR  ( Users_3.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_3.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_3.EmailAddress = 'us...@redhat.com' )
    )
)
AND (main.Type = 'ticket')
AND (main.EffectiveId = main.id)
;
explain SELECT COUNT(DISTINCT main.id) FROM Tickets main 
      JOIN Groups Groups_1 ON ( Groups_1.Domain = 'RT::Ticket-Role' ) AND ( 
Groups_1.Type = 'Requestor' ) AND ( Groups_1.Instance = main.id ) 
      JOIN CachedGroupMembers CachedGroupMembers_18  ON 
(CachedGroupMembers_18.GroupId = Groups_1.id ) 
      JOIN CachedGroupMembers CachedGroupMembers_8   ON ( 
CachedGroupMembers_8.GroupId = Groups_1.id )
      JOIN CachedGroupMembers CachedGroupMembers_16  ON ( 
CachedGroupMembers_16.GroupId = Groups_1.id ) 
      JOIN CachedGroupMembers CachedGroupMembers_12  ON ( 
CachedGroupMembers_12.GroupId = Groups_1.id ) 
      JOIN CachedGroupMembers CachedGroupMembers_2   ON 
(CachedGroupMembers_2.GroupId = Groups_1.id ) 
      JOIN CachedGroupMembers CachedGroupMembers_6   ON ( 
CachedGroupMembers_6.GroupId = Groups_1.id )
      JOIN CachedGroupMembers CachedGroupMembers_4   ON ( 
CachedGroupMembers_4.GroupId = Groups_1.id ) 
      JOIN CachedGroupMembers CachedGroupMembers_14  ON ( 
CachedGroupMembers_14.GroupId = Groups_1.id ) 
      JOIN CachedGroupMembers CachedGroupMembers_10  ON ( 
CachedGroupMembers_10.GroupId = Groups_1.id )
 LEFT JOIN Users Users_15  ON ( Users_15.id = CachedGroupMembers_14.MemberId )
 LEFT JOIN Users Users_7   ON ( Users_7.id = CachedGroupMembers_6.MemberId )
 LEFT JOIN Users Users_17  ON ( Users_17.id = CachedGroupMembers_16.MemberId )
 LEFT JOIN Users Users_5   ON ( Users_5.id = CachedGroupMembers_4.MemberId )
 LEFT JOIN Users Users_3   ON ( Users_3.id = CachedGroupMembers_2.MemberId )
 LEFT JOIN Users Users_13  ON ( Users_13.id = CachedGroupMembers_12.MemberId )
 LEFT JOIN Users Users_19  ON ( Users_19.id = CachedGroupMembers_18.MemberId )
 LEFT JOIN Users Users_9   ON ( Users_9.id = CachedGroupMembers_8.MemberId )
 LEFT JOIN Users Users_11  ON ( Users_11.id = CachedGroupMembers_10.MemberId )
WHERE
(  main.Status != 'deleted' )
AND (
      main.Created > '2010-08-31 14:00:00'
      AND (
            ( Users_3.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_5.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_7.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_9.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_11.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_13.EmailAddress = 'us...@redhat.com' )  
        OR  ( Users_15.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_17.EmailAddress = 'us...@redhat.com' )
        OR  ( Users_19.EmailAddress = 'us...@redhat.com' )
    )
)
AND (main.Type = 'ticket')
AND (main.EffectiveId = main.id)
;
$ rt-attributes-viewer 15787
Content of attribute #15787: $VAR1 = {
          'ContentType' => 'storable',
          'Content' => {
                         'Order' => 'ASC|ASC|ASC|ASC',
                         'Query' => 'Created > \'2010-09-01\' AND (  
Requestor.EmailAddress = \'us...@example.com\' OR Requestor.EmailAddress = 
\'us...@example.com\' OR Requestor.EmailAddress = \'us...@example.com\' OR 
Requestor.EmailAddress = \'us...@example.com\' OR Requestor.EmailAddress = 
\'us...@example.com\' OR Requestor.EmailAddress = \'us...@example.com\' OR 
Requestor.EmailAddress = \'us...@example.com\' OR Requestor.EmailAddress = 
\'us...@example.com\' OR Requestor.EmailAddress = \'us...@example.com\' )',
                         'SearchType' => 'Ticket',
                         'OrderBy' => 'id|||',
                         'Format' => '\'   <b><a 
href="__WebPath__/Ticket/Display.html?id=__id__">__id__</a></b>/TITLE:#\',
\'<b><a 
href="__WebPath__/Ticket/Display.html?id=__id__">__Subject__</a></b>/TITLE:Subject\',
\'__Status__\',
\'__QueueName__\',
\'__OwnerName__\',
\'__Priority__\',
\'__NEWLINE__\',
\'\',
\'<small>__Requestors__</small>\',
\'<small>__CreatedRelative__</small>\',
\'<small>__ToldRelative__</small>\',
\'<small>__LastUpdatedRelative__</small>\',
\'<small>__TimeLeft__</small>\'',
                         'RowsPerPage' => '50'
                       },
          'Description' => 'Test evil',
          'Name' => 'SavedSearch',
          'ObjectId' => '1235',
          'ObjectType' => 'RT::User'
        };

--------
RT Training Sessions (http://bestpractical.com/services/training.html)
*  Chicago, IL, USA — September 26 & 27, 2011
*  San Francisco, CA, USA — October 18 & 19, 2011
*  Washington DC, USA — October 31 & November 1, 2011
*  Melbourne VIC, Australia — November 28 & 29, 2011
*  Barcelona, Spain — November 28 & 29, 2011

Reply via email to