Thread Performanzproblem (DBIx::Class + mehrere Tabellen) (6 answers)
Opened by pktm at 2009-02-13 15:01

pktm
 2009-02-13 15:01
#118846 #118846
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich habe zum Spielen mit DBIx::Class ja mal ein Forum gebastelt. Mit den Testdaten hat das auch prima funktioniert, jetzt habe ich zum testen der Suchfunktion ganz viele Daten eingespielt (ca. 100.000 Posts).

Nun dauerte der Aufbau der Übersichtseite auf einmal 23 Sekunden :-s
Also habe ich angefangen, die Sache zu optimieren. Mein Testskript braucht jetzt "nur noch" 3 Sekunden. Das ist immer noch zu viel. Ich nehme mal an, dass ich den falschen Ansatz habe, eventuell kann mri da ja jemand helfen.

Hier ist mein Test:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/perl

use strict;
use warnings;
use Carp qw/croak/;
use Data::Dumper qw/Dumper/;
use Perl6::Say;
use Benchmark;

use FindBin qw/$Bin/;
use lib $Bin . '/..';
use Bulletinboard::Schema;
use Config::Auto;

my $t0 = Benchmark->new();

my $cfg = Config::Auto::parse($Bin.'/../config/config.pl');

my $schema = Bulletinboard::Schema->connection(
$cfg->{db}->{dsn},
$cfg->{db}->{username},
$cfg->{db}->{password},
$cfg->{db}->{attributes},
);
#$schema->storage->debug(1);

my @topic_loop = ();

my $trs = $schema->resultset('Topic')->search(
undef,
{
order_by => 'me.position ASC',
prefetch => [qw/boards/],
}
);
while( my $topic = $trs->next() ) {

say $topic->topic();

my @board_loop = ();
foreach my $board ( $topic->boards() ) {

say "\t" . $board->title();

# -- get the latest thread
my ($lastthread) = $board->threads(
undef,
{
order_by => 'date_of_creation DESC',
}
)->slice(0,1);

print "\t\t" . $lastthread->subject() . ": ";

my $lastpost = undef;
if( defined $lastthread ) {
($lastpost) = $lastthread->posts(
undef,
{
select => 'timestamp',
order_by => 'timestamp DESC',
}
)->slice(0,1);
say $lastpost->timestamp();
}else{
say "no posts";
}

}

}

my $t1 = Benchmark->new();

my $td = Benchmark::timediff($t1, $t0);
say 'benchmark_timediff: ' . timestr($td);


Der Teil, der den letzten Beitrag errechnet ist derjenige, der die ganze Zeit verbraucht. Kommentiert man ihn aus, bin ich bei 0 wallclock secs ( 0.17 usr + 0.03 sys = 0.20 CPU).

Nur, wie komme ich effizienter an den letzten Beitrag? Sollte ich den besser manuell pflegen? Also die ID des letzten Posts in einem Thread in der Thread-Tabelle mitführen und aktualisieren, wenn ein beitrag verfasst wird?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )

View full thread Performanzproblem (DBIx::Class + mehrere Tabellen)