open(INFILE1,"INPUT.txt");
my $modfile = 'Data.txt';
open MODIFIED,'>',$modfile or die "Could not open $modfile : $!";
for (;;) {
my $line1 = <INFILE1>;
last if not defined $line1;
my $line2 = <INFILE1>;
last if not defined $line2;
my ($tablename1, $colname1,$sql1) = split(/\t/, $line1);
my ($tablename2, $colname2,$sql2) = split(/\t/, $line2);
if ($tablename1 eq $tablename2)
{
my $sth1 = $dbh->prepare($sql1);
$sth1->execute;
my $hash_ref1 = $sth1->fetchall_hashref('KEY');
my $sth2 = $dbh->prepare($sql2);
$sth2->execute;
my $hash_ref2 = $sth2->fetchall_hashref('KEY');
my @fieldname = split(/,/, $colname1);
my $colcnt=0;
my $rowcnt=0;
foreach $key1 (keys(%{$hash_ref1}))
{
foreach (@fieldname)
{
$colname =$_;
my $strvalue1='';
@val1 = $hash_ref1->{$key1}->{$colname};
if (defined @val1)
{
my @filtered = grep /@val1/, @metadata;
my $strvalue1 = substr(@filtered[0],index(@filtered[0],'||') + 2);
}
my $strvalue2='';
@val2 = $hash_ref2->{$key1}->{$colname};
if (defined @val2)
{
my @filtered = grep /@val2/, @metadata2;
my $strvalue2 = substr(@filtered[0],index(@filtered[0],'||') + 2);
}
if ($strvalue1 ne $strvalue2)
{
$colcnt = $colcnt + 1;
print MODIFIED "$tablename1\t$colname\t$strvalue1\t$strvalue2\n";
}
}
}
if ($colcnt>0)
{
print "modified count is $colcnt\n";
}
%$hash_ref1 =();
%$hash_ref2 =();
}
该程序是读取输入文件,其中每行禁止三个字符串由制表符分隔。第一个是TableName,第二个是ALL列名,逗号在第三个之间,第三个包含要运行的SQL。由于此功能正在对数据进行比较,因此每个表名都有两行。每个DB一个。所以数据需要从每个数据库中挑选出来,然后逐列比较。Perl - 以大量时间进行数据比较
SQL作为结果集中的ID返回,并且如果值来自db,则需要通过从数组中读取来将其转换为字符串(该数组包含键和值由||分隔的100K记录)
现在我运行这个包含每个数据库18K记录的一组表。在每个sql中从db中选取8列。因此,对于18K中的每个记录,然后对于该记录中的每个字段,即8,该脚本花费了大量时间。
我的问题是,如果有人可以看看它是否可以不受限制,以便它花费更少的时间。 文件内容样品
INPUT.TXT
TABLENAME COL1,COL2 select COL1,COL2 from TABLENAME where ......
TABLENAMEB COL1,COL2 select COL1,COL2 from TABLENAMEB where ......
元数据数组包含这样的事情(有两个,即每个DB)
111||Code 1
222||Code 2
请建议
你是否通过探查器(如Devel :: NYTProf或Devel :: DProf)运行它,并消除延迟在SQL执行中的可能性? – imran 2013-04-11 15:58:40
通常在循环中“准备”是一件坏事。你确定你不能在循环之外“准备”所有的查询,只是稍后用不同的参数“执行”它们? – gangabass 2013-04-11 16:00:48
查询是否总是返回相同的一组列?你究竟在比较什么?代码很混乱,但是你能说出你在找什么吗?例如。 _我想要TABLENAME中所有行的列表,但不是TABLENAMEB_或类似的东西? – 2013-04-11 16:12:26