Re: [rt-users] Slow query on CFs

2013-06-07 Thread Ruslan Zakirov
On Fri, Jun 7, 2013 at 3:31 PM, Vegard Vesterheim <
vegard.vesterh...@uninett.no> wrote:

> On Fri, 07 Jun 2013 09:32:46 +0200 Christian Loos 
> wrote:
>
> > Hi,
> >
> > the Database indexes are not optimal for the ObjectCustomFieldValues
> > table. Sadly I didn't had time to dig deeper into this.
> > But maybe you have time and an new index will help you.
>
> Thanks for the tip. Better indexing might help, but in this case the SQL
> query is clearly suboptimal, so a fix in the SQL generation is in order
> anyway. In our database, a properly optimised SQL statement returns
> results immediately.
>

In this case there is no better indexing. The SQL itself falls into
category of hardly optimizable by DBs. Some DBs do better job by using hash
joins, but mysql with its loop strategy can not cope.


> > There is already an ticket open for this:
> > http://issues.bestpractical.com/Ticket/Display.html?id=16898
>
> The symptoms might be the same (slow queries), so the tickets might be
> related, but I think this is two separate issues which will require
> different solutions. One issue is about suboptimal SQL, the other issue
> is about suboptimal indexes.
>
>  - Vegard V -
>
>
> --
> RT Training in Seattle, June 19-20: http://bestpractical.com/training
>



-- 
Best regards, Ruslan.


-- 
RT Training in Seattle, June 19-20: http://bestpractical.com/training

Re: [rt-users] Slow query on CFs

2013-06-07 Thread Vegard Vesterheim
On Fri, 07 Jun 2013 09:32:46 +0200 Christian Loos  wrote:

> Hi,
>
> the Database indexes are not optimal for the ObjectCustomFieldValues
> table. Sadly I didn't had time to dig deeper into this.
> But maybe you have time and an new index will help you.

Thanks for the tip. Better indexing might help, but in this case the SQL
query is clearly suboptimal, so a fix in the SQL generation is in order
anyway. In our database, a properly optimised SQL statement returns
results immediately.

> There is already an ticket open for this:
> http://issues.bestpractical.com/Ticket/Display.html?id=16898

The symptoms might be the same (slow queries), so the tickets might be
related, but I think this is two separate issues which will require
different solutions. One issue is about suboptimal SQL, the other issue
is about suboptimal indexes.

 - Vegard V -


-- 
RT Training in Seattle, June 19-20: http://bestpractical.com/training


Re: [rt-users] Slow query on CFs

2013-06-07 Thread Christian Loos
Hi,

the Database indexes are not optimal for the ObjectCustomFieldValues
table. Sadly I didn't had time to dig deeper into this.
But maybe you have time and an new index will help you.

There is already an ticket open for this:
http://issues.bestpractical.com/Ticket/Display.html?id=16898

Chris


-- 
RT Training in Seattle, June 19-20: http://bestpractical.com/training


Re: [rt-users] Slow query on CFs

2013-06-05 Thread Ruslan Zakirov
On Wed, Jun 5, 2013 at 11:08 AM, Vegard Vesterheim <
vegard.vesterh...@uninett.no> wrote:

> On Tue, 4 Jun 2013 17:30:02 +0400 Ruslan Zakirov 
> wrote:
>
> > Hi,
> >
> > It's not a bug, but missing feature.
>
> Hm, ok. This problem makes searching for multiple values in CFs unusable
> for our purposes. I would like to help in getting it fixed. For now I
> have worked around it by searching for one CF value at a time in a
> loop. Seems a bit silly since this is something SQL could handle easily.
>
> Should I register this as a feature request somewhere, or is this
> something that is already on the map?
>
> > It's possible to improve using similar improvements to searches by
> > watchers. If you want to help then you can take a look at recent
> > changes in lib/RT/Tickets_SQL.pm.
>
> Yes, I had a quick look at the relevant git commits. I guess the problem
> is similar.
>

If you don't have cycles and/or knoledge to help here then file a bug
report on http://issues.bestpractical.com .



>
>  - Vegard V -
>



-- 
Best regards, Ruslan.


-- 
RT Training in Seattle, June 19-20: http://bestpractical.com/training

Re: [rt-users] Slow query on CFs

2013-06-05 Thread Vegard Vesterheim
On Tue, 04 Jun 2013 07:47:02 -0700 Thomas Sibley  wrote:

> I'm sure you've considered this, but I have to ask: Could you simplify
> most of the CF conditions with CF.{utstyr} ENDSWITH '.uninett.no'?

Thanks for the suggestion, but no, that will not give me the result I am
after.

 - Vegard V -


-- 
RT Training in Seattle, June 19-20: http://bestpractical.com/training


Re: [rt-users] Slow query on CFs

2013-06-05 Thread Vegard Vesterheim
On Tue, 4 Jun 2013 17:30:02 +0400 Ruslan Zakirov  wrote:

> Hi,
>
> It's not a bug, but missing feature. 

Hm, ok. This problem makes searching for multiple values in CFs unusable
for our purposes. I would like to help in getting it fixed. For now I
have worked around it by searching for one CF value at a time in a
loop. Seems a bit silly since this is something SQL could handle easily.

Should I register this as a feature request somewhere, or is this
something that is already on the map?

> It's possible to improve using similar improvements to searches by
> watchers. If you want to help then you can take a look at recent
> changes in lib/RT/Tickets_SQL.pm.

Yes, I had a quick look at the relevant git commits. I guess the problem
is similar. 

 - Vegard V -


-- 
RT Training in Seattle, June 19-20: http://bestpractical.com/training


Re: [rt-users] Slow query on CFs

2013-06-04 Thread Thomas Sibley
On 06/04/2013 06:03 AM, Vegard Vesterheim wrote:
> A RT (TicketSQL) query like this:
> 
> Queue = 'drift' AND (  Status = 'new' or Status = 'open' or Status =
> 'stalled' ) AND (  CF.{utstyr} = 'ufisaweb.uninett.no' OR CF.{utstyr} =
> 'dss2.uninett.no' OR CF.{utstyr} = 'myrhauk.uninett.no' OR CF.{utstyr} =
> 'angel.uninett.no' OR CF.{utstyr} = 'jatoba-esxi2.uninett.no' OR
> CF.{utstyr} = 'bold.uninett.no' OR CF.{utstyr} = 'nidar.uninett.no' OR
> CF.{utstyr} = 'voll.uninett.no' OR CF.{utstyr} = 'brekka.uninett.no' OR
> CF.{utstyr} = 'www.stroemme.no' OR CF.{utstyr} = 'xen.uninett.no' OR
> CF.{utstyr} = 'jatoba-kvm4.uninett.no' OR CF.{utstyr} =
> 'inventory.uninett.no' OR CF.{utstyr} = 'busy.uninett.no' OR CF.{utstyr}
> = 'ufisa.uninett.no' OR CF.{utstyr} = 'wildfire.uninett.no' OR
> CF.{utstyr} = 'newfire.uninett.no' OR CF.{utstyr} = 'fou1.uninett.no' OR
> CF.{utstyr} = 'kanari.uninett.no' OR CF.{utstyr} = 'dok.uninett.no' OR
> CF.{utstyr} = 'ebony-kvm5.uninett.no' OR CF.{utstyr} =
> 'jatoba-kvm12.uninett.no' )

I'm sure you've considered this, but I have to ask: Could you simplify
most of the CF conditions with CF.{utstyr} ENDSWITH '.uninett.no'?

For a technical solution, the approach Ruslan described is the way to
go.  It works great for watchers.


-- 
RT Training in Seattle, June 19-20: http://bestpractical.com/training


Re: [rt-users] Slow query on CFs

2013-06-04 Thread Ruslan Zakirov
Hi,

It's not a bug, but missing feature. It's possible to improve using similar
improvements to searches by watchers. If you want to help then you can take
a look at recent changes in lib/RT/Tickets_SQL.pm.


On Tue, Jun 4, 2013 at 5:03 PM, Vegard Vesterheim <
vegard.vesterh...@uninett.no> wrote:

> A RT (TicketSQL) query like this:
>
> Queue = 'drift' AND (  Status = 'new' or Status = 'open' or Status =
> 'stalled' ) AND (  CF.{utstyr} = 'ufisaweb.uninett.no' OR CF.{utstyr} =
> 'dss2.uninett.no' OR CF.{utstyr} = 'myrhauk.uninett.no' OR CF.{utstyr} =
> 'angel.uninett.no' OR CF.{utstyr} = 'jatoba-esxi2.uninett.no' OR
> CF.{utstyr} = 'bold.uninett.no' OR CF.{utstyr} = 'nidar.uninett.no' OR
> CF.{utstyr} = 'voll.uninett.no' OR CF.{utstyr} = 'brekka.uninett.no' OR
> CF.{utstyr} = 'www.stroemme.no' OR CF.{utstyr} = 'xen.uninett.no' OR
> CF.{utstyr} = 'jatoba-kvm4.uninett.no' OR CF.{utstyr} =
> 'inventory.uninett.no' OR CF.{utstyr} = 'busy.uninett.no' OR CF.{utstyr}
> = 'ufisa.uninett.no' OR CF.{utstyr} = 'wildfire.uninett.no' OR
> CF.{utstyr} = 'newfire.uninett.no' OR CF.{utstyr} = 'fou1.uninett.no' OR
> CF.{utstyr} = 'kanari.uninett.no' OR CF.{utstyr} = 'dok.uninett.no' OR
> CF.{utstyr} = 'ebony-kvm5.uninett.no' OR CF.{utstyr} =
> 'jatoba-kvm12.uninett.no' )
>
> gets translated to the following SQL:
>
> SELECT COUNT(DISTINCT main.id) FROM Tickets main LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_5 ON (
> ObjectCustomFieldValues_5.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_5.Disabled = '0' ) AND (
> ObjectCustomFieldValues_5.ObjectId = main.id ) AND (
> ObjectCustomFieldValues_5.CustomField = '8' ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_3 ON (
> ObjectCustomFieldValues_3.CustomField = '8' ) AND (
> ObjectCustomFieldValues_3.Disabled = '0' ) AND (
> ObjectCustomFieldValues_3.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_3.ObjectId = main.id ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_22 ON (
> ObjectCustomFieldValues_22.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_22.CustomField = '8' ) AND (
> ObjectCustomFieldValues_22.Disabled = '0' ) AND (
> ObjectCustomFieldValues_22.ObjectId = main.id ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_19 ON (
> ObjectCustomFieldValues_19.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_19.CustomField = '8' ) AND (
> ObjectCustomFieldValues_19.Disabled = '0' ) AND (
> ObjectCustomFieldValues_19.ObjectId = main.id ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_10 ON (
> ObjectCustomFieldValues_10.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_10.CustomField = '8' ) AND (
> ObjectCustomFieldValues_10.Disabled = '0' ) AND (
> ObjectCustomFieldValues_10.ObjectId = main.id ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_4 ON (
> ObjectCustomFieldValues_4.Disabled = '0' ) AND (
> ObjectCustomFieldValues_4.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_4.CustomField = '8' ) AND (
> ObjectCustomFieldValues_4.ObjectId = main.id ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_8 ON (
> ObjectCustomFieldValues_8.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_8.CustomField = '8' ) AND (
> ObjectCustomFieldValues_8.ObjectId = main.id ) AND (
> ObjectCustomFieldValues_8.Disabled = '0' ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_21 ON (
> ObjectCustomFieldValues_21.CustomField = '8' ) AND (
> ObjectCustomFieldValues_21.Disabled = '0' ) AND (
> ObjectCustomFieldValues_21.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_21.ObjectId = main.id ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_12 ON (
> ObjectCustomFieldValues_12.CustomField = '8' ) AND (
> ObjectCustomFieldValues_12.Disabled = '0' ) AND (
> ObjectCustomFieldValues_12.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_12.ObjectId = main.id ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_16 ON (
> ObjectCustomFieldValues_16.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_16.Disabled = '0' ) AND (
> ObjectCustomFieldValues_16.CustomField = '8' ) AND (
> ObjectCustomFieldValues_16.ObjectId = main.id ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_17 ON (
> ObjectCustomFieldValues_17.Disabled = '0' ) AND (
> ObjectCustomFieldValues_17.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_17.CustomField = '8' ) AND (
> ObjectCustomFieldValues_17.ObjectId = main.id ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_20 ON (
> ObjectCustomFieldValues_20.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_20.CustomField = '8' ) AND (
> ObjectCustomFieldValues_20.Disabled = '0' ) AND (
> ObjectCustomFieldValues_20.ObjectId = main.id ) LEFT JOIN
> ObjectCustomFieldValues ObjectCustomFieldValues_13 ON (
> ObjectCustomFieldValues_13.ObjectType = 'RT::Ticket' ) AND (
> ObjectCustomFieldValues_13.Disabled = '0' ) AND (
> ObjectC

[rt-users] Slow query on CFs

2013-06-04 Thread Vegard Vesterheim
A RT (TicketSQL) query like this:

Queue = 'drift' AND (  Status = 'new' or Status = 'open' or Status =
'stalled' ) AND (  CF.{utstyr} = 'ufisaweb.uninett.no' OR CF.{utstyr} =
'dss2.uninett.no' OR CF.{utstyr} = 'myrhauk.uninett.no' OR CF.{utstyr} =
'angel.uninett.no' OR CF.{utstyr} = 'jatoba-esxi2.uninett.no' OR
CF.{utstyr} = 'bold.uninett.no' OR CF.{utstyr} = 'nidar.uninett.no' OR
CF.{utstyr} = 'voll.uninett.no' OR CF.{utstyr} = 'brekka.uninett.no' OR
CF.{utstyr} = 'www.stroemme.no' OR CF.{utstyr} = 'xen.uninett.no' OR
CF.{utstyr} = 'jatoba-kvm4.uninett.no' OR CF.{utstyr} =
'inventory.uninett.no' OR CF.{utstyr} = 'busy.uninett.no' OR CF.{utstyr}
= 'ufisa.uninett.no' OR CF.{utstyr} = 'wildfire.uninett.no' OR
CF.{utstyr} = 'newfire.uninett.no' OR CF.{utstyr} = 'fou1.uninett.no' OR
CF.{utstyr} = 'kanari.uninett.no' OR CF.{utstyr} = 'dok.uninett.no' OR
CF.{utstyr} = 'ebony-kvm5.uninett.no' OR CF.{utstyr} =
'jatoba-kvm12.uninett.no' )

gets translated to the following SQL:

SELECT COUNT(DISTINCT main.id) FROM Tickets main LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_5 ON (
ObjectCustomFieldValues_5.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_5.Disabled = '0' ) AND (
ObjectCustomFieldValues_5.ObjectId = main.id ) AND (
ObjectCustomFieldValues_5.CustomField = '8' ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_3 ON (
ObjectCustomFieldValues_3.CustomField = '8' ) AND (
ObjectCustomFieldValues_3.Disabled = '0' ) AND (
ObjectCustomFieldValues_3.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_3.ObjectId = main.id ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_22 ON (
ObjectCustomFieldValues_22.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_22.CustomField = '8' ) AND (
ObjectCustomFieldValues_22.Disabled = '0' ) AND (
ObjectCustomFieldValues_22.ObjectId = main.id ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_19 ON (
ObjectCustomFieldValues_19.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_19.CustomField = '8' ) AND (
ObjectCustomFieldValues_19.Disabled = '0' ) AND (
ObjectCustomFieldValues_19.ObjectId = main.id ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_10 ON (
ObjectCustomFieldValues_10.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_10.CustomField = '8' ) AND (
ObjectCustomFieldValues_10.Disabled = '0' ) AND (
ObjectCustomFieldValues_10.ObjectId = main.id ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_4 ON (
ObjectCustomFieldValues_4.Disabled = '0' ) AND (
ObjectCustomFieldValues_4.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_4.CustomField = '8' ) AND (
ObjectCustomFieldValues_4.ObjectId = main.id ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_8 ON (
ObjectCustomFieldValues_8.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_8.CustomField = '8' ) AND (
ObjectCustomFieldValues_8.ObjectId = main.id ) AND (
ObjectCustomFieldValues_8.Disabled = '0' ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_21 ON (
ObjectCustomFieldValues_21.CustomField = '8' ) AND (
ObjectCustomFieldValues_21.Disabled = '0' ) AND (
ObjectCustomFieldValues_21.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_21.ObjectId = main.id ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_12 ON (
ObjectCustomFieldValues_12.CustomField = '8' ) AND (
ObjectCustomFieldValues_12.Disabled = '0' ) AND (
ObjectCustomFieldValues_12.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_12.ObjectId = main.id ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_16 ON (
ObjectCustomFieldValues_16.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_16.Disabled = '0' ) AND (
ObjectCustomFieldValues_16.CustomField = '8' ) AND (
ObjectCustomFieldValues_16.ObjectId = main.id ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_17 ON (
ObjectCustomFieldValues_17.Disabled = '0' ) AND (
ObjectCustomFieldValues_17.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_17.CustomField = '8' ) AND (
ObjectCustomFieldValues_17.ObjectId = main.id ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_20 ON (
ObjectCustomFieldValues_20.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_20.CustomField = '8' ) AND (
ObjectCustomFieldValues_20.Disabled = '0' ) AND (
ObjectCustomFieldValues_20.ObjectId = main.id ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_13 ON (
ObjectCustomFieldValues_13.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_13.Disabled = '0' ) AND (
ObjectCustomFieldValues_13.ObjectId = main.id ) AND (
ObjectCustomFieldValues_13.CustomField = '8' ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_2 ON (
ObjectCustomFieldValues_2.Disabled = '0' ) AND (
ObjectCustomFieldValues_2.ObjectId = main.id ) AND (
ObjectCustomFieldValues_2.ObjectType = 'RT::Ticket' ) AND (
ObjectCustomFieldValues_2.CustomField = '8' ) LEFT JOIN
ObjectCustomFieldValues ObjectCustomFieldValues_9 ON (
ObjectCustomFieldValues_9.CustomF