Hallo zusammen,
ich habe schon das internet durchforstet aber irgendwie habe ich noch nix gescheites zu meinem Problem gefunden. Daher versuche ich es mal über diesen Weg.
ich habe ein Perl-Script. Mit diesem Script möchte ich Daten aus eine MySQL-Datenbank ziehen (Adressen), welche ca. 3 Mio Datensätze hat. Hierbei mach ich einen Select-befehl und möchte z.b. 2000 Datensätze ziehen.
Leider bin ich in dieser Hinsicht noch ein Newbie und daher nicht so bewandert. Das problem liegt in der Performance. So brache die Select-Anweisung viel zu lange in meinen Augen und ich habe keine Ahnung warum dies der Fall ist. Ich hoffen mir kann jemand helfen.
Hier der Code:
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
#! /usr/bin/perl
use DBI;
@tmp_bu=(1,2,3,4,5,6,7,8,9)
$i=0;
open(OUT,'>>',"$Pfad"."SAM"."$samzahl") or die "$!";
while (<@tmp_bu>) # je bundesland
{
$zahl[$i]=2000;
#Prüfung verfügbarer Adressen, sonst maximal mögliche verwenden
$sql="SELECT Count(Lfd_Nr) FROM Daten WHERE Bundesland=".$tmp_bu[$i].";";
$row = $dbh->selectrow_arrayref($sql);
$verfugadr = $row->[0];
if ($verfugadr < $zahl[$i]) {$zahl[$i]=$verfugadr;}
#selectrow is extrem langsam, gibts da ne andere Methode?
# -> extremer Zeitfresser
$sql = "SELECT Lfd_Nr, Vorname, Name, Adresse, PLZ, Bundesland, Anz_Benutz FROM Daten WHERE Bundesland=".$tmp_bu[$i]." ORDER BY Name asc, rand() limit ".$zahl[$i].";";}
my $sth = $dbh->prepare($sql) || die DBI->errstr();
$sth->execute() || die DBI->errstr();
#hier das execute sehr langsam. das prepare kann ich nicht außerhalb der ersten
#Schleife machen, da er das limit nicht richtig setzen kann.
#also wenn ich außerhalb das prepare mache mit "limit ?",
#dann erzeugt mir prepare und execute jeweils ein ' so dass dann stehen würde "limit ''40''
# -> extremer Zeitfresser
while (@row = $sth->fetchrow_array)
{
$key=$key+1;
$results="*key=$key;nam=$row[1] $row[2];adr=$row[3];plz=$row[4];;bland=$row[5]";
print OUT "$results\n";
$benutz=$row[6]+1;
if ($benutz == 6) {$benutz=0;}
my $sql = "UPDATE Daten SET Anz_Benutzung=$benutz WHERE Lfd_Nr=$row[0]";
my $sth = $dbh->prepare($sql) || die DBI->errstr();
$sth->execute() || die DBI->errstr();
#das execute ist zwar auch net schnell aber schneller als das erste :-)
}
$i=$i+1;
$sth->finish;
}
Ich habe das Script mit DProf geprüft und besonders beim execute der Select Anweisung ist es extrem langsam. Für Hilfe bin i sehr dankbar.
Lg
Stefan
edit pq: code-tags hinzugefügt\n\n
<!--EDIT|pq|1183123814-->