[Rt-devel] 3.6.4rc1 performance regression on a fairly complex search (CROSS JOIN???)

Jesse Vincent jesse at bestpractical.com
Tue May 29 15:43:26 EDT 2007


On May 29, 2007, at 3:36 PM, Dirk Pape wrote:

> Halle Jesse, hello Ruslan,
>
> the following ticket search query (captured from the advanced tab)  
> leads to very different Searchbuilder compilations in 3.6.3 an  
> 3.6.4rc1 (captured from mysql-slow.log):

So, I think the CROSS Joins are a red herring. This looks like a  
bundling change. The issue is the multiple joins on Users. Ruz: What  
got touched there? (And yes, this is enough to cause an rc2 ;)



> Queue = 'trash' AND  (  Requestor.EmailAddress LIKE 'staff@' OR
> Requestor.EmailAddress LIKE 'math.fu' OR Requestor.EmailAddress LIKE
> 'inf.fu' OR Requestor.EmailAddress LIKE 'mi.fu' OR
> Requestor.EmailAddress LIKE 'cedis.fu' OR Requestor.EmailAddress LIKE
> 'zuv.fu' OR Requestor.EmailAddress LIKE 'pcpool.mi' ) AND  (  Status =
> 'new' OR Status = 'open' )
>
> is very straight forward and reasonably fast with 3.6.3:
>
> # Query_time: 5  Lock_time: 0  Rows_sent: 1  Rows_examined: 259307
> SELECT COUNT(DISTINCT main.id) FROM Tickets main JOIN Groups  
> Groups_1  ON ( Groups_1.Instance = main.id ) JOIN  
> CachedGroupMembers CachedGroupMembers_2 ON  
> ( CachedGroupMembers_2.GroupId != CachedGroupMembers_2.MemberId )  
> AND ( CachedGroupMembers_2.GroupId = Groups_1.id ) JOIN Users  
> Users_3  ON ( Users_3.id = CachedGroupMembers_2.MemberId )  WHERE  
> (Groups_1.Domain = 'RT::Ticket-Role') AND (main.Status !=  
> 'deleted') AND (Groups_1.Type = 'Requestor') AND (main.Queue = '57'  
> AND  (  ( Users_3.EmailAddress LIKE '%staff@%' OR  
> Users_3.EmailAddress LIKE '%math.fu%' OR Users_3.EmailAddress LIKE  
> '%inf.fu%' OR Users_3.EmailAddress LIKE '%mi.fu%' OR  
> Users_3.EmailAddress LIKE '%cedis.fu%' OR Users_3.EmailAddress LIKE  
> '%zuv.fu%' OR Users_3.EmailAddress LIKE '%pcpool.mi%' )  )  AND   
> ( main.Status = 'new' OR main.Status = 'open' ) ) AND (main.Type =  
> 'ticket') AND (main.EffectiveId = main.id);
>
> but with 3.6.4rc1 introduces some CROSS JOINs (I never ever heard  
> of anything like this), which seems not to be a good thing:
>
> # Query_time: 373  Lock_time: 0  Rows_sent: 0  Rows_examined: 54382391
> SELECT COUNT(DISTINCT main.id) FROM Tickets main CROSS JOIN Users  
> Users_3 CROSS JOIN Users Users_5 CROSS JOIN Users Users_7 CROSS  
> JOIN Users Users_9 CROSS JOIN Users Users_11 CROSS JOIN Users  
> Users_13 CROSS JOIN Users Users_15 JOIN Groups Groups_1  ON  
> ( Groups_1.Domain = 'RT::Ticket-Role' ) AND ( Groups_1.Type =  
> 'Requestor' ) AND ( Groups_1.Instance = main.id ) LEFT JOIN  
> CachedGroupMembers CachedGroupMembers_14  ON  
> ( CachedGroupMembers_14.GroupId = Groups_1.id ) AND  
> ( CachedGroupMembers_14.MemberId = Users_15.id ) LEFT JOIN  
> CachedGroupMembers CachedGroupMembers_10  ON ( CachedGroupMembers_10.M
> emberId = Users_11.id ) AND ( CachedGroupMembers_10.GroupId =  
> Groups_1.id ) LEFT JOIN CachedGroupMembers CachedGroupMembers_8  ON  
> ( CachedGroupMembers_8.GroupId = Groups_1.id ) AND  
> ( CachedGroupMembers_8.MemberId = Users_9.id ) LEFT JOIN  
> CachedGroupMembers CachedGroupMembers_12  ON  
> ( CachedGroupMembers_12.MemberId = Users_13.id ) AND  
> ( CachedGroupMembers_12.GroupId = Groups_1.id ) LEFT JOIN  
> CachedGroupMembers CachedGroupMembers_2  ON  
> ( CachedGroupMembers_2.MemberId = Users_3.id ) AND  
> ( CachedGroupMembers_2.GroupId = Groups_1.id ) LEFT JOIN  
> CachedGroupMembers CachedGroupMembers_6  ON  
> ( CachedGroupMembers_6.MemberId = Users_7.id ) AND  
> ( CachedGroupMembers_6.GroupId = Groups_1.id ) LEFT JOIN  
> CachedGroupMembers CachedGroupMembers_4  ON  
> ( CachedGroupMembers_4.MemberId = Users_5.id ) AND  
> ( CachedGroupMembers_4.GroupId = Groups_1.id )
> WHERE (main.Status != 'deleted') AND (main.Queue = '57' AND   
> (  ( Users_3.EmailAddress LIKE '%staff@%' AND  
> CachedGroupMembers_2.id IS NOT NULL )  OR  ( Users_5.EmailAddress  
> LIKE '%math.fu%' AND CachedGroupMembers_4.id IS NOT NULL )  OR   
> ( Users_7.EmailAddress LIKE '%inf.fu%' AND CachedGroupMembers_6.id  
> IS NOT NULL )  OR  ( Users_9.EmailAddress LIKE '%mi.fu%' AND  
> CachedGroupMembers_8.id IS NOT NULL )  OR  ( Users_11.EmailAddress  
> LIKE '%cedis.fu%' AND CachedGroupMembers_10.id IS NOT NULL )  OR   
> ( Users_13.EmailAddress LIKE '%zuv.fu%' AND  
> CachedGroupMembers_12.id IS NOT NULL )  OR  ( Users_15.EmailAddress  
> LIKE '%pcpool.mi%' AND CachedGroupMembers_14.id IS NOT NULL )  )   
> AND  ( main.Status = 'new' OR main.Status =
> 'open' ) ) AND (main.Type = 'ticket') AND (main.EffectiveId =  
> main.id);
>
> Sorry for line breaks. I hope you can reproduce and fix it for 3.6.4.
>
> Regards, Dirk.
> _______________________________________________
> List info: http://lists.bestpractical.com/cgi-bin/mailman/listinfo/ 
> rt-devel
>



More information about the Rt-devel mailing list