Schrift
[thread]3688[/thread]

wie datenbankabfrage gestalten?: alle inserts gleichzeitig?



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
steinwolf
 2006-05-16 22:52
#34402 #34402
User since
2003-08-04
367 Artikel
BenutzerIn
[default_avatar]
hallo.

mit dbi starte ich eine db-execution. sind ca. 200-300 inserts auf einmal. soll ich alle inserts in eine einzige sql-ausführung einbauen oder jedesmal einzeln ne routine ausführen??

zurzeit mach ich jeden insert einzeln mit ner routine. dabei stürzt mir aber regelmäßig der sql-server ab.

mfg
steinigen
"Did you know? You can use your old motor oil to fertilize your lawn." - Blinkster - Professionelles EDV Forum
Thorium
 2006-05-16 23:30
#34403 #34403
User since
2003-08-04
232 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das Ausführen von mehreren Inserts nacheinander in dem gleichen SQL-Script ist meistens effektiver als das Ausführen nacheinander. Aber was für eine Datenbank schmiert dir bitteschön bei sowas ab?
Ich würd die Inserts auf jedenfall zusammenpacken. 200-300 sind wirklich keine Zahl... Bei tausenden ist es dann Sinnvoll einzelne zwischen-Commits auszuführen...
Per|li|nist der; -en, -en <zu ↑...ist>: a) Anhänger, Vertreter der radikalen Perlinisten die Perl als die einzig wahre Sprache ansehen; b) Mitglied einer perlinistischen Community.
Strat
 2006-05-17 01:07
#34404 #34404
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn es sich immer um dasselbe statement mit unterschiedlichen werten handelt, koennte es je nach datenbank was bringen, wenn du mit platzhaltern arbeitest, z.B. wenn du die daten als zweidim. array hast:
Code: (dl )
1
2
3
4
5
6
7
my $sql = "INSERT INTO table (val1, val2, val3) VALUES (?,?,?)";
my $sth = $dbh->prepare($sql) or die "Error: $DBI::errstr";
foreach my $line (@data) {
$sth->execute(@$line)
or die "Error in execute: @$line: $DBI::errstr\n";
} # foreach
$sth->finish();

wenn's so nicht hilft, dann waeren naehere Infos zum server und der fehlermeldung hilfreich...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
nepos
 2006-05-17 12:07
#34405 #34405
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wobei prepare nicht bei jeder Datenbank was bringt. Aber nen Versuch isses sicher wert.
Ne DB, die bei 200 Inserts abstuerzt, die wuerd ich recht schnell in die Tonne hauen btw.
steinwolf
 2006-05-17 12:20
#34406 #34406
User since
2003-08-04
367 Artikel
BenutzerIn
[default_avatar]
die sub, die ich 300 maln hintereinander aufrufe sieht so aus.


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub insertINTO()
{
##Verbindung herstellen
my $tabelle = "urls";

my $dbh = DBI->connect("DBI:mysql:$db:$host",$user,$pwd);

my $sql = shift || "";
my $query = $dbh->prepare($sql);

#Query ausführen
$query->execute;

$query->finish();
$dbh->disconnect();
}


ich werd wohl tatsächlich versuchen müssen, das in ner schleife zu bearbeiten...
"Did you know? You can use your old motor oil to fertilize your lawn." - Blinkster - Professionelles EDV Forum
pq
 2006-05-17 12:31
#34407 #34407
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
omg, wenn du auch 300 mal die verbindung zur datenbank aufmachst und
wieder zumachst...
wieso hältst du die verbindung nicht einfach solange offen? das könnte dein
problem wohl schon lösen.\n\n

<!--EDIT|pq|1147854716-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
GwenDragon
 2006-05-17 12:57
#34408 #34408
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
@steinwolf

Am Anfang den connect und am Ende des Skripts den disconnect!
nepos
 2006-05-18 11:22
#34409 #34409
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Oha, 300x Connect+Disconnect ist heftig :)
steffenw
 2006-05-19 01:50
#34410 #34410
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Steinwolf, Dein Code ist perfekt, 0 % Fehlerbehandlung. Lies Dir mal die POD vom DBI-Modul durch, da findest Du etwas zu "RaiseError" und natürlich auch alles dazu, bei welcher der Methoden was passiet und wie man performant die Datenbank benutzt, also wann "prepare/execute" und wann "do".

@Strat, spätestens wenn Du mit mehreren $dbh arbeitest, dann ist nach dem connect $DBI::errstr oder auch $DBI::err tödlich, weil das der letzte Fehler im DBI pauschal ist und nicht der Fehler auf dem jeweiligen Handle. Fehler vom prepare, do, ... also mit $dbh->errstr und Fehler vom execute, fetch, ... mit $sth->errstr, behandlen anstatt $DBI::errstr.
$SIG{USER} = sub {love 'Perl' or die};
nepos
 2006-05-19 02:01
#34411 #34411
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wobei das teils auch von der Datenbank abhaengt. Bei Postgresql bringt ein prepare+execute keine Vorteile, soweit ich das im Kopf hab. Da muss man halt in der Doku zum jeweiligen DBD-Modul nachlesen.
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2006-05-16 22:52.