sybase更新越来越慢

时间:2013-10-26 10:17:06

标签: sql database linux perl sybase

我有一个大约4GB的大文本文件,超过800万行,我正在写一个perl脚本来逐行读取这个文件,做一些处理并将信息更新到sybase,我是批量做的方式,每批1000行用于更新提交,但问题是,首先,批处理只花费10到20秒,但随着处理的进行,更新批处理变得越来越慢,批处理成本为3到4分钟,我绝对不知道为什么会这样!任何机构都可以帮助我分析这可能是什么原因?提前谢谢,在我的膝盖上...

1 个答案:

答案 0 :(得分:0)

  
    

==>我正在写一个perl脚本来逐行读取这个文件,做一些处理并将信息更新到sybase

         

请一次完成整个处理,一次性处理您的源文件;根据需要使用散列,数组准备数据结构,然后开始将数据插入数据库。

  

在将大数据插入数据库时​​,请牢记以下几点。

1-如果每个列数据都不是太大,那么您也可以一次性插入整个数据。(您可能需要良好的RAM,不确定大小,因为它取决于您需要处理的数据集)。

2-你应该使用perl DBI的execute_array,这样你就可以一次插入数据。

3-如果您没有足够的RAM来一次插入数据,请分配您的数据(可能是8部分,每次100万行)。

4-同时确保您准备一次声明。在每次运行中,您只是使用新数据集执行。

5-关闭auto_commit。

使用perl DBI的execute_array的示例代码。我用它将大约1000万个数据插入到mysql中。

请将数据保存在数组中,如下所示。    @ column1_data,@ column2_data,@ column3_data

 print $logfile_handle, "Total records to insert--".scalar(@column1_data);
    print $logfile_handle, "Inserting data into database";
    my $sth = $$dbh_ref->prepare("INSERT INTO $tablename (column1,column2,column3) VALUES (?,?,?)")
                or print ($logfile_handle, "ERROR- Couldn't prepare statement: " . $$dbh_ref->errsr) && exit;
    my $tuples = $sth->execute_array(
                { ArrayTupleStatus => \my @tuple_status },
                \@column1_data,
                \@column2_data,
                \@column3_data
                );

$$dbh_ref->do("commit");
    print ($logfile_handle,"Data Insertion Completed.");
    if ($tuples) {
        print ($logfile_handle,"Successfully inserted $tuples records\n");
    } else {
    ##print Error log or those linese which are not inserted
        my $status = $tuple_status[$tuple];
            $status = [0, "Skipped"] unless defined $status;
            next unless ref $status;
            print ($logfile_handle, "ERROR- Failed to insert (%s,%s,%s): %s\n",
                        $column1_data[$tuple], $column2_data[$tuple],$column3_data[$tuple], $status->[1]);
        }
    }