[rt-devel] WhoHaveRight query optimization

Willem Jan Palenstijn palenstijn at planet.nl
Tue Mar 11 17:47:36 EST 2003


Hi,

We're currently trying to run RT 2-1-84 on RedHat 8 (Apache 2.0.40,
Postgresql 7.2.3, mod-perl 1.99_05).

However, we've run into a problem: any ticket transactions were
originally very slow. Pressing the 'New ticket in' button resulted in a
wait of over 5 minutes on a lightly-loaded Athlon 550, with a database
of about 640 tickets and 80 users). We traced this down to the query
executed by WhoHaveRight in Users_Overlay.pm, when determining who has
the OwnTicket right.

We have made two changes to WhoHaveRight to speed this up:

1: The condition "$groups.Id = $groupprinc.id" is included on both
branches of the (top-level) OR in the 'WhichGroup' sub-clause. Moving it
to outside of the OR resulted in a huge speedup. (Presumably because
this made things easier on the query planner)

2: It turned out that the query is using 3 aliases of the Principals
table, two of which are equal: $self->{'princalias'} and $userprinc.
(Because the ID of both is equal to 'main.id'). I'm not entirely sure if
it's safe to do, but replacing
my $userprinc = $self->NewAlias('Principals');
with
my $userprinc = $self->{'princalias'};
speeded things up quite a lot here.

After these changes, the runtime of the query has been reduced to a more
acceptable 5 seconds.

Manually optimizing the query by using explicit JOINs instead of WHERE
conditions results in a runtime of only 100ms, incidentally. I suspect
the postgresql query scheduler may be having some issues with the
produced queries :-(

-Willem Jan


P.S.: sorry if you receive this twice. I first sent it about 30 hours
ago from an address not subscribed to rt-devel, and it didn't show up on
the list.




More information about the Rt-devel mailing list