AW: [rt-devel] Question about performance on KeywordSelects
Warnke Andreas
Andreas.Warnke at 3SOFT.de
Fri Jan 17 05:30:18 EST 2003
Hello,
I've done some research on my performance problem (version 2.0.15):
When calling Search/Listing.html,
2 SQL Queries on the Queues table,
1 SQL Queries on the Tickets table,
1 SQL Queries on the KeywordSelects table,
1 SQL Queries on the Users table,
39 SQL Queries on the Watchers table,
1900 SQL Queries on the Keywords table are evaluated.
I admit, that I have quite a lot of keywords defined - but nonetheless: there are more queries than keywords.
So: I've still one question and a solution to speed this up by 25%.
What is this 'up to xy levels deep' field in the KeywordSelects table? Should this limit the depth of the keywords-search-tree? I have the impression, that this does not work in 2.0.15.
My first solution is a chaching-algorithm: Add the line
%RT::Keywords::KCache=();
to the end of the <%INIT> section of webrt/Admin/Keywords/index.html to delete the cache when the keywords are modified and exchange the file lib/RT/Keywords.pm by:
(The 'NEXT'-method is new)
===============================================================
#$Header: /pro/CVS/rt/rt-2-0-15/lib/RT/Keywords.pm,v 1.1.1.1 2002/10/11 13:55:30 root Exp $
=head1 NAME
RT::Keywords - a collection of RT::Keyword objects
=head1 SYNOPSIS
use RT::Keywords;
my $keywords = RT::Keywords->new($user);
$keywords->LimitToParent(0);
while my ($keyword = $keywords->Next()) {
print $keyword->Name ."\n";
}
=head1 DESCRIPTION
=head1 METHODS
=begin testing
ok (require RT::TestHarness);
ok (require RT::Keywords);
=end testing
=cut
package RT::Keywords;
use strict;
use vars qw( @ISA %KCache );
use RT::EasySearch;
use RT::Keyword;
@ISA = qw( RT::EasySearch );
%KCache = ();
# {{{ sub _Init
sub _Init {
my $self = shift;
$self->{'table'} = 'Keywords';
$self->{'primary_key'} = 'id';
# By default, order by name
$self->OrderBy( ALIAS => 'main',
FIELD => 'Name',
ORDER => 'ASC');
# ----------------------------------------
# modified by Andreas Warnke @3soft.de
# ----------------------------------------
# Cache Parameters:
$self->{'Cached'} = 0;
@{$self->{'List'}} = ();
# ----------------------------------------
return ($self->SUPER::_Init(@_));
}
# }}}
# {{{ sub _DoSearch
=head2 _DoSearch
A subclass of DBIx::SearchBuilder::_DoSearch that makes sure that _Disabled rows never get seen unless
we're explicitly trying to see them.
=cut
sub _DoSearch {
my $self = shift;
#unless we really want to find disabled rows, make sure we\'re only finding enabled ones.
unless($self->{'find_disabled_rows'}) {
$self->LimitToEnabled();
}
my $returnvalue = $self->SUPER::_DoSearch(@_);
return($returnvalue);
}
# }}}
# {{{ sub NewItem
sub NewItem {
my $self = shift;
return (RT::Keyword->new($self->CurrentUser));
}
# }}}
# {{{ sub LimitToParent
=head2 LimitToParent
Takes a parent id and limits the returned keywords to children of that parent.
=cut
sub LimitToParent {
my $self = shift;
my $parent = shift;
$self->Limit( FIELD => 'Parent',
VALUE => $parent,
OPERATOR => '=',
ENTRYAGGREGATOR => 'OR' );
}
# }}}
# ----------------------------------------
# added by Andreas Warnke @3soft.de
# ----------------------------------------
# {{{ sub Next
=head2 Next
This is an analysis of the Next-Calls
=cut
sub Next {
my $self = shift;
# DEBUG INFO
open ( DEBUGFILECACHE, '>>/home/install/debugcache.txt');
# get the result, if found in cache
if ( $self->{'Cached'} == 1 ) {
print DEBUGFILECACHE "2nd-level-cached entry served.\n";
close DEBUGFILECACHE;
return shift @{$self->{'List'}};
}
# lookup cache, if not yet checked:
if ( ! $self->{'Cached'} ) {
my %restrs = %{$self->{'restrictions'}};
my $cond = $restrs{'main.Parent'};
if ( $KCache{$cond} ) {
if (! $self->{'find_disabled_rows'}) {
@{$self->{'List'}} = @{$KCache{$cond}};
$self->{'Cached'} = 1;
print DEBUGFILECACHE "looked up 1st-level-cache for '$cond', cached entry served.\n";
close DEBUGFILECACHE;
return shift @{$self->{'List'}};
}
else {
print DEBUGFILECACHE "Search for cached disabled entries skipped.\n";
$self->{'Cached'}=3;
}
}
else {
print DEBUGFILECACHE "looked up 1st-level-cache for '$cond', undef.\n";
$self->{'Cached'}=2;
}
}
# get the value from the database:
my $returnvalue = $self->SUPER::Next(@_);
# add the value to this objects list:
if ( $returnvalue ) {
push @{$self->{'List'}}, $returnvalue;
print DEBUGFILECACHE "stored entry in 2nd-level-cache, entry served.\n";
close DEBUGFILECACHE;
return $returnvalue;
}
# add this objects list to the internal cache:
else {
if ( $self->{'Cached'}!=3 )
{
my %restrs2 = %{$self->{'restrictions'}};
my $cond2 = $restrs2{'main.Parent'};
@{$KCache{$cond2}} = @{$self->{'List'}};
print DEBUGFILECACHE "stored in 1st-level-cache under '$cond2', undef served.\n";
close DEBUGFILECACHE;
return undef;
}
else {
print DEBUGFILECACHE "Search for disabled not stored in 1st-level-cache, undef served.\n";
close DEBUGFILECACHE;
return undef;
}
}
}
# }}}
# ----------------------------------------
1;
===============================================================
-----Ursprüngliche Nachricht-----
Von: Warnke Andreas
Gesendet: Mittwoch, 8. Januar 2003 17:33
An: rt-devel at lists.fsck.com
Betreff: [rt-devel] Question about performance on KeywordSelects
Hello,
Since I defined about 50 global KeywordSelects for each ticket, the
System appears to be quite slow. (on Version 2.0.15) Is the number of 50
too much - or is it more likely that there is an other reason.
Would it make sense to implement a cacheing algorithm for the SQL
queries on the KeywordSelects and the Keyword table?
Thank you for comments.
Andi
--
Andreas Warnke
3SOFT GmbH, Frauenweiherst. 14, 91058 Erlangen
Tel.: +49-9131-7701-274 mailto:Andreas.Warnke at 3SOFT.de
Fax: +49-9131-7701-333 http://www.3SOFT.de
_______________________________________________
rt-devel mailing list
rt-devel at lists.fsck.com
http://lists.fsck.com/mailman/listinfo/rt-devel
More information about the Rt-devel
mailing list