0

我有 2 台服务器:dbh1 和 dbh2,我在其中查询 dbh1 并通过 fetchall_arrayref 方法提取数据。执行查询后,我想将 dbh1 的输出插入到服务器 dbh2 上的临时表中。

我能够同时建立对两台服务器的访问权限,并且能够从两者中提取数据。1.我从dbh1拉数据:

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

2. 然后在 dbh2 上我有一个插入查询:

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

问题:如何将 dbh1 中的 fetchall_arrayref 的批量结果插入到服务器 dbh2 上的临时表中(不循环单个记录)?

好的 - 所以我能够解决这个问题并能够实现以下代码:

     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;

传输工作,但它仍然比我通过 SQL Server 导出/导入向导手动传输数据要慢。我注意到的问题是数据逐行流入目的地,我想知道是否可以增加批量传输大小。它下载数据的速度非常快,但是当我结合下载和上传时,速度会急剧下降,在服务器之间传输 5000 行表需要长达 10 分钟。

4

2 回答 2

2

如果你说你的目标是什么(速度?)而不是问一个关于避免循环的具体问题会更好。

对于 Perl/DBI 方式:

看看 DBI 的execute_arrayexecute_for_fetch但是因为你没有告诉我们你正在使用哪个 DBD,所以不可能再说更多。并非所有 DBD 都支持批量插入,当它们不支持时,DBI 会模拟它。DBD::Oracle 确实和 DBD::ODBC 确实(在最近的版本中,请参见odbc_array_operations),但在后者中,默认情况下它是关闭的。

于 2012-08-09T08:40:06.523 回答
1

您没有提及您使用的是哪个版本的 SQL Server。首先,我会研究该版本的“BULK INSERT”支持。

您也没有提到涉及多少行。我会假设它们适合内存,否则批量插入将不起作用。

从那里您可以将输出fetchall_arrayref转换为“BULK INSERT”操作所需的语法。

于 2012-08-09T00:40:57.790 回答