Perl DBI - 在两个sql服务器之间传输数据 - fetchall_arrayref

时间:2012-08-08 22:54:39

标签: sql sql-server perl dbi dbix-class

我有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分钟。

2 个答案:

答案 0 :(得分:2)

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

对于Perl / DBI方式:

请注意DBI的execute_arrayexecute_for_fetch,但是由于您没有告诉我们您正在使用哪个DBD,因此无法再说明。并非所有DBD都支持批量插入,并且当它们没有DBI模拟它时。 DBD :: Oracle和DBD :: ODBC一样(在最近的版本中看到odbc_array_operations),但在后者中它默认是关闭的。

答案 1 :(得分:1)

您没有提到您正在使用的SQL Server版本。首先,我将研究该版本的“BULK INSERT”支持。

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

由此决定将fetchall_arrayref的输出转换为“BULK INSERT”操作所需的语法。