Perl DBI – dataübertragung zwischen zwei SQL server – fetchall_arrayref

Ich habe 2 server: dbh1 und dbh2 wo ich abfragen dbh1 und ziehe data über fetchall_arrayref Methode. Sobald ich die Abfrage ausführen, möchte ich die Ausgabe von dbh1 in eine temporäre Tabelle auf server dbh2 insert.

Ich bin in der Lage, Zugriff auf beide server zur gleichen time zu etablieren und bin in der Lage, data von beiden zu ziehen. 1. Ich ziehe data von dbh1:

while($row = shift(@$rowcache) || shift(@{$rowcache=$sth1->fetchall_arrayref(undef, $max_rows)})) { #call to sub insert2tempData &insert2tempData(values @{$row}); } 

2. Dann auf dbh2 habe ich eine insert query:

  INSERT INTO ##population (someid, Type, anotherid) VALUES ('123123', 'blah', '634234'); 

Frage: Wie kann ich das Massenergebnis des fetchall_arrayref von dbh1 in die temp-Tabelle auf dem server dbh2 insert (ohne einzelne datasätze zu durchlaufen)?

Ok – so konnte ich dieses Problem lösen und konnte den folgenden Code implementieren:

  my $max_rows = 38; my $rowcache = []; my $sum = 0; if($fldnames eq "ALL"){ $fldnames = join(',', @{ $sth1->{NAME} });} my $ins = $dbh2->prepare("insert into $database2.dbo.$tblname2 ($fldnames) values $fldvalues"); my $fetch_tuple_sub = sub { shift(@$rowcache) || shift(@{$rowcache=$sth1->fetchall_arrayref(undef, $max_rows)}) }; my @tuple_status; my $rc; $rc = $ins->execute_for_fetch($fetch_tuple_sub, \@tuple_status); my @errors = grep { ref $_ } @tuple_status; 

Die Übertragung funktioniert aber es ist noch langsamer als wenn ich data manuell über den SQL server Export / Import Wizard übertragen würde. Das Problem, das ich bemerke, ist, dass die data Zeile für Zeile in das Ziel fließt und ich frage mich, ob es möglich ist, die Massenübertragungsgröße zu erhöhen. Es lädt die data extrem schnell herunter, aber wenn ich den Download und den Upload kombiniere, dann verringern sich die Geschwindigkeiten drastisch und es dauert bis zu 10 Minuten, um eine 5000-Zeilentabelle zwischen den servern zu übertragen.

Es wäre besser, wenn du sagst, was dein Ziel war (Geschwindigkeit), anstatt eine bestimmte Frage zum Vermeiden von Looping zu fragen.

Für einen Perl / DBI-path:

Schau auf DBI's execute_array und execute_for_fetch aber wie du uns nicht gesagt hast, welche DBD du benutzt hast, ist unmöglich, mehr zu sagen. Nicht alle DBDs unterstützen Bulk-Insert und wenn sie nicht DBI emuliert es. DBD :: Oracle und DBD :: ODBC tut (in den letzten Versionen siehe odbc_array_operations ), aber in letzterem ist es standardmäßig ausgeschaltet.

Sie haben nicht erwähnt, welche Version von SQL server Sie verwenden. Zuerst würde ich in die "BULK INSERT" Unterstützung dieser Version schauen.

Sie haben auch nicht erwähnt, wie viele Zeilen beteiligt sind. Ich nehme an, dass sie in das Gedächtnis passen, sonst wird ein Bulk-deployment nicht funktionieren.

Von dort ist es an Ihnen, die Ausgabe von fetchall_arrayref in die für die Operation "BULK INSERT" benötigte Syntax zu übreplace.